剑指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 }

运行截图如下

剑指offter-面试题7.用两个栈实现队列

我们再队列中依次进入1,2,3 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。

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

你可能感兴趣的:(面试题)