剑指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 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。

好了,就到这里吧。是不是明白了呢?

posted @ 2015-07-21 16:23  vpoet  阅读(251)  评论(0编辑  收藏  举报