剑指offter-面试题7.用两个栈实现队列
题目.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead
分别完成在对尾插入节点和在队头删除节点。
该队列类模板如下:
1 template <typename T> 2 class CQueue 3 { 4 public: 5 void appendTail(const T& node); 6 T deleteHead() 7 8 private: 9 stack<T> stack1; 10 stack<T> stack2; 11 }
首先先说明一些概念:
栈和队列是两种常用的抽象的数据结构。当然可以用数组和链表分别来实现。
1.栈的特点是先进后出,最后进入栈的元素最先出栈,而最先进入栈的元素却被
压在栈底,最后才能取出。
2.队列的特点是先进先出,类似于食堂打饭排队一样,先排队的先打饭,后
排队的后打饭。
3.这里我们声明了一个函数模板,函数模板其实是一种泛型编程思想,而
C++中的STL库大量使用这种思想,比如我们声明一个容器vector,这个
vector可以是整型的容器 vector<int> 可以是string类型的容器 vector<string>
然而vector对于不同的数据类型提供了同样的操作,这使得程序的可复用性
大大增强。
两个栈实现一个队列的插入和删除功能,步骤如下:
1.设两个栈为stack1和stack2
2.队列尾端插入直接插入在stack1中
3.对于删除队列头部节点,如果stack2不为空,
那么直接从stack2顶端取出元素(stack2中的元素为stack1中的元素顺序出栈再顺序插入到栈stack2中)
4.如果stack2为空,那么我们将stack1中的元素顺序出栈再压入stack2中。然后再从stack2中取出元素。
实现如下:
single.h中我们实现这个队列模板类:
1 #include <stack> 2 using namespace std; 3 4 template <typename T> 5 class CQueue 6 { 7 public: 8 void appendTail(const T& node); 9 T deleteHead(); 10 11 private: 12 stack<T> stack1; 13 stack<T> stack2; 14 }; 15 16 template <typename T> void CQueue<T>::appendTail(const T& node) 17 { 18 stack1.push(node); 19 } 20 21 22 template <typename T> T CQueue<T>::deleteHead() 23 { 24 if(!stack2.empty()) 25 { 26 T temp=stack2.top(); 27 stack2.pop(); 28 return temp; 29 } 30 else 31 { 32 if(stack1.empty()) 33 { 34 cout<<"队列元素为空,请先插入元素入队列\n"; 35 } 36 else 37 { 38 while(!stack1.empty()) 39 { 40 stack2.push(stack1.top()); 41 stack1.pop(); 42 } 43 44 T temp=stack2.top(); 45 stack2.pop(); 46 return temp; 47 } 48 49 } 50 }
在main.cpp中测试该队列类的插入和删除:
1 #include "single.h" 2 #include <iostream> 3 using namespace std; 4 5 6 int main() 7 { 8 CQueue<int> queue; 9 int data; 10 queue.deleteHead(); 11 cout<<"Please input the data you want to append in queue(0-exit):"<<endl; 12 while(true) 13 { 14 cin>>data; 15 if(data!=0) 16 { 17 queue.appendTail(data); 18 } 19 else 20 { 21 break; 22 } 23 24 } 25 26 cout<<"Delete a queue node:"<<queue.deleteHead()<<endl; 27 cout<<"Delete a queue node:"<<queue.deleteHead()<<endl; 28 cout<<"Delete a queue node:"<<queue.deleteHead()<<endl; 29 queue.deleteHead(); 30 31 return 0; 32 }
运行截图如下:
我们再队列中依次进入1,2,3 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。
好了,就到这里吧。是不是明白了呢?
作者:vpoet
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/vpoet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。