剑指offer面试题7
来源:互联网 发布:java对接微信公众平台 编辑:程序博客网 时间:2024/04/30 09:12
面试题7:用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。
using namespace std;template <typename T> class CQueue{public: CQueue(void); ~CQueue(void); // 在队列末尾添加一个结点 void appendTail(const T& node); // 删除队列的头结点 T deleteHead();private: stack<T> stack1; //容器stack stack<T> stack2;};
预备知识:
栈:是一种常见的数据结构,如操作系统会给每个线程创建一个栈来存储函数调用时各个函数的参数、返回地址及临时变量;特点是后进先出(LIFO)
队列:队列也是一种常见的数据结构;特点是先进先出(FIFO)
在STL中有stack和queue两个容器
template <class T, class Container = deque<T> > class stack;成员函数:
empty;
size; //大小
top; //访问下一个元素
push; //插入元素
pop; //移除顶部元素
template <class T, class Container = deque<T> > class queue;成员函数:
empty 判断容器是否为空
size 队列大小
front 访问下一个元素
back 访问最后一个元素
push 插入元素
pop 移除元素
思路:定义两个栈stack1和stack2,先把数据压入stack1中,然后将stack1的数据弹出,压入stack2中,之后逐个弹出stack2中的元素,这样就可以实现利用两个栈实现队列的功能。
代码实现:
Queue.h
#pragma once //在头文件的最开始加入这条指令就能够保证头文件被编译一次#include <stack> //stack容器,stack#include <exception>using namespace std;template <typename T> class CQueue{public: CQueue(void); //构造函数 ~CQueue(void); //析构函数 // 在队列末尾添加一个结点 void appendTail(const T& node); // 删除队列的头结点 T deleteHead();private: stack<T> stack1; //容器stack stack<T> stack2;};//构造函数template <typename T> CQueue<T>::CQueue(void){}//析构函数template <typename T> CQueue<T>::~CQueue(void){}//在队列尾部插入结点template<typename T> void CQueue<T>::appendTail(const T& element){ stack1.push(element); //把元素压入栈中} //在队列头部删除结点template<typename T> T CQueue<T>::deleteHead(){ if(stack2.size()<= 0) { while(stack1.size()>0) { T& data = stack1.top(); //Access next element stack1.pop(); //Remove top element stack2.push(data); //Insert element } } if(stack2.size() == 0) throw new exception("queue is empty"); T head = stack2.top(); //Access next element stack2.pop(); //Remove top element return head;}
Queue.cpp
#include "StdAfx.h"#include "Queue.h"#include <queue> //queue容器
Main.cpp
#include "stdafx.h"#include "Queue.h"void Test(char actual, char expected){ if(actual == expected) printf("Test passed.\n"); else printf("Test failed.\n");}int _tmain(int argc, _TCHAR* argv[]){ CQueue<char> queue;//向队列中加入元素 queue.appendTail('a'); queue.appendTail('b'); queue.appendTail('c');//删除头结点 char head = queue.deleteHead(); Test(head, 'a'); head = queue.deleteHead(); Test(head, 'b'); queue.appendTail('d'); head = queue.deleteHead(); Test(head, 'c'); queue.appendTail('e'); head = queue.deleteHead(); Test(head, 'd'); head = queue.deleteHead(); Test(head, 'e'); return 0;}
另附代码:
// 面试题7.cpp : 定义控制台应用程序的入口点。//// 用两个栈实现队列#include "stdafx.h"#include <stack>#include <iostream>using namespace std;template <typename T> class CQueue{public:CQueue(void);//{}~CQueue(void);//{}void appendTail(const T& node);T deleteHead();private:stack<T> stack1;stack<T> stack2;};/*************类的实现******/template<typename T> CQueue<T>::CQueue(void){}template<typename T> CQueue<T>::~CQueue(void){}template<typename T> void CQueue<T>::appendTail(const T& element){stack1.push(element);}template<typename T> T CQueue<T>::deleteHead(){if(stack2.size() <= 0){while(stack1.size() > 0){T& data = stack1.top(); //栈顶元素stack1.pop();//出栈stack2.push(data); //入栈}}if(stack2.size() == 0)throw new exception("queue is empty");T head = stack2.top(); //栈顶元素stack2.pop();//出栈return head;}/******代码测试*******/void Test1(){CQueue<int> queue;queue.appendTail(1);queue.appendTail(2);queue.appendTail(3);int val = queue.deleteHead();cout << "val = " << val << endl;}void Test2(){CQueue<int> queue;queue.appendTail(1);queue.appendTail(2);queue.appendTail(3);int val = queue.deleteHead();cout << "val = " << val << endl;queue.appendTail(5);cout << "val1= "<<queue.deleteHead();}void Test3(){CQueue<int> queue;queue.appendTail(1);queue.appendTail(2);queue.appendTail(3);queue.deleteHead();queue.deleteHead();queue.deleteHead();}int _tmain(int argc, _TCHAR* argv[]){Test1();Test2();Test3();return 0;}
0 0
- 剑指offer面试题7
- 剑指offer 面试题7
- 剑指offer-面试题7
- 【面试题】剑指offer 7
- 剑指offer 面试题
- 剑指offer面试题
- 剑指Offer(面试题6~7)
- 剑指Offer面试题7 & Leetcode232
- 剑指Offer学习 面试题7
- 剑指offer面试题总结
- 剑指offer面试题06
- 剑指offer面试题 04
- 剑指offer 面试题07
- 剑指offer面试题08
- 剑指offer面试题42
- 剑指offer面试题1
- 剑指offer面试题3
- 剑指offer面试题4
- 如何用JLINK ULINK JTAG 查看 KEIL /MDK 某条指令执行时间
- 。
- Effective C++ Item 7 为多态基类声明virtual析构函数
- 美轮美奂的phonegap(八)---写phonegap插件实现本地的代码
- 蓝桥杯——说好的进阶之买不到的数目
- 剑指offer面试题7
- Opencv IplImage说明(转)
- C程序设计语言(K&R)学习笔记--3.函数、作用域、内部变量与外部变量
- MFC 滚动条学习
- 【索引】Counting
- 【efm32】开发板 蓝牙测试
- 用IT技术玩金融系列文章
- Axis1.4生成和调用Webservice
- Android适配器之CursorAdapter