队列与栈的相互实现

Problem:
  如何仅用队列结构实现栈结构?

Solution:
  队列是先进先出,而栈是先进后出  

  故使用两个队列来实现一个栈的功能  

  一个存放原来的数据,

  另一个做数据倒腾的容器

Code:

  

 1 class QueueToStack
 2 {
 3 private:
 4     queue<int>Data, Temp;
 5
 6 public:
 7     void Push(int a)
 8     {
 9         Data.push(a);
10     }
11     int Top()
12     {
13         int DataSize = Data.size();
14         for (int i = 0; i < DataSize - 1; ++i)//将data的数据倒腾进temp,留一个就是top了
15         {
16             Temp.push(Data.front());
17             Data.pop();
18         }
19         int res = Data.front();
20         Temp.push(Data.front());
21         Data.pop();
22
23         auto tem = Data;
24         Data = Temp;
25         Temp = Data;//交换回来,始终保持数据在Data中
26
27         return res;//返回top值
28     }
29
30     void Pop()
31     {
32         int DataSize = Data.size();
33         for (int i = 0; i < DataSize - 1; ++i)//将data的数据倒腾进temp,留一个就是top了
34         {
35             Temp.push(Data.front());
36             Data.pop();
37         }
38         Data.pop();//删除top值
39
40         auto tem = Data;
41         Data = Temp;
42         Temp = Data;//交换回来,始终保持数据在Data中
43     }
44
45 };

Problem2:
   如何仅用栈结构实现队列结构?

解题思路:
   同样的,使用两个栈Data,Temp来实现列表功能
   Data用来存放数据,Temp用来倒腾数据

Code:

  

 1 class StackToQueue
 2 {
 3 private:
 4     stack<int>Data, Temp;
 5
 6 public:
 7     void Push(int a)
 8     {
 9         Data.push(a);
10     }
11     int Front()
12     {
13         while (!Data.empty())
14         {
15             Temp.push(Data.top());
16             Data.pop();
17         }
18         int res = Temp.top();
19         while (!Temp.empty())
20         {
21             Data.push(Temp.top());
22             Temp.pop();
23         }
24         return res;
25     }
26
27     void Pop()
28     {
29         while (!Data.empty())
30         {
31             Temp.push(Data.top());
32             Data.pop();
33         }
34         Temp.pop();
35         while (!Temp.empty())
36         {
37             Data.push(Temp.top());
38             Temp.pop();
39         }
40     }
41 };

测试代码:

  

 1 void Test()
 2 {
 3     QueueToStack myStack;
 4     myStack.Push(1);
 5     myStack.Push(2);
 6     myStack.Push(3);
 7     myStack.Push(4);
 8     myStack.Push(5);
 9     myStack.Push(6);
10
11     cout << myStack.Top() << endl;
12     myStack.Pop();
13     cout << myStack.Top() << endl;
14     myStack.Pop();
15     cout << myStack.Top() << endl;
16     myStack.Push(10);
17     myStack.Push(12);
18     cout << myStack.Top() << endl;
19
20
21
22     cout << "=========================" << endl;
23     cout << "=========================" << endl;
24     cout << "=========================" << endl;
25
26     StackToQueue myQueue;
27     myQueue.Push(1);
28     myQueue.Push(2);
29     myQueue.Push(3);
30     myQueue.Push(4);
31     myQueue.Push(5);
32     myQueue.Push(6);
33
34     cout << myQueue.Front() << endl;
35     myQueue.Pop();
36     cout << myQueue.Front() << endl;
37     myQueue.Pop();
38     cout << myQueue.Front() << endl;
39
40     myQueue.Push(7);
41     myQueue.Push(8);
42
43     cout << myQueue.Front() << endl;
44
45 }

原文地址:https://www.cnblogs.com/zzw1024/p/10988243.html

时间: 2024-10-09 19:45:46

队列与栈的相互实现的相关文章

数据结构(08)_队列和栈的相互实现

1. 栈的队列的相互实现 思考:栈和队列在实现上非常相似,能否用相互实现? 1.1. StackToQueue 用栈实现队列等价于用"后进先出"的特性实现"先进先出"的特性.实现思路: 准备两个栈用于实现队列:stack_in和stack_out 入队列:当有新元素入队时,将其压入队列stack_in 出队列:当需要出队时:1.stack_out.size() == 0,将stack_in中的数据逐一弹出并压人stack_out(数据移动)2.stack_out.s

关于队列与栈相互模拟的读书笔记

栈与队列都是比较高级的数据结构,虽然不难,但有时有些问题也比较灵活,在<编程之美>与<剑指offer>上就有一些这样的题目.用队列模拟栈.用站栈模拟队列,以及现实队列与栈的最大值与最小值求解,这些都是基础的,只要理解栈的后进先出与队列的先进先出特点即可解决. 1.栈模拟队列 用两个栈,元素从一个栈stackA进入,从另一个栈stackB出来.进队列时直接添加到stackA,出队列时若stackA非空,则直接出,否则将stackB中元素全部初战装到stackA,然后从stackA出栈

编程题目: 两个队列实现栈(Python)

感觉两个队列实现栈 比 两个栈实现队列 麻烦 1.栈为空:当两个队列都为空的时候,栈为空 2.入栈操作:当队列2为空的时候,将元素入队到队列1:当队列1位空的时候,将元素入队到队列2: 如果队列1 和 队列2 都为空的时候,那就选择入队到队列1. 3.出队操作:当两个队列都为空的时候,引发错误"栈为空": 当队列2位空的时候,如果队列1中只有一个元素,则直接将队列1中的元素出队: 如果队列1不止一个元素的时候,就将队列1的元素出队然后入队到队列2,知道队列1中只有一个元素,然后将队列1

C语言算法系列---1.队列和栈

写在前面:在家玩了好久,实在是不知道干嘛了,突然想找些事做,现在是时候做些什么了.这些东西不见得多高深,也可能很简单,但很基础,也无法忽视.同时,也是自己学习走过的一条路. 这是开头,就写写C的队列和栈的一些算法吧. 首先是栈的一些基础功能的实现,先贴代码: #include<stdlib.h> #include<stdio.h> typedef int SElemType; //声明栈元素类型为int typedef int Status; //函数返回值的类型为int #def

剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 我们通过一个具体的例子来分析该队列插入和删除元素的过程.首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空.再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有{a,b,c},其中c位于栈顶,而stack2仍然为空. 这个时候,我们试着删除从队列中删除一个元素.

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

数组的队列和栈方法

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>数组的队列和栈方法</title></head><body><script>// 栈是一种LIFO(Last-In-First-Out后进先出)的数据结构,js中的push()和pop()类似栈的行为// 队列是一种FIFO(

1.3 背包、队列和栈

知识点 背包:只进不出,迭代顺序不确定(即无先后顺序) 队列:先进先出 栈   :后进先出 两种基础数据结构:数组和链表 数据结构 优点 缺点 数组 通过索引可以访问任意元素 在初始化时就需要知道元素的数量 链表 使用的空间大小和元素数量成正比 需要通过引用访问任意元素 练习 1.3.1 为FixedCapacityStackOfStrings添加一个方法isFull().       /*其中注意N的含义,别和数组下标完全混淆*/ public class FixedCapacityStack

【JavaSE】day05_List集合_List排序_队列和栈

1.List集合 1)有序集,可重复集.List的特点是可以像数组一样,根据下标操作元素.所以List提供了一些独有的方法. 2)常用实现类: --ArrayList:内部由数组实现,查询快. --LinkedList:内部由链表实现,增删快. 3)E get(int index) 获取指定下标对应的元素.(下标从0开始) 4)E set(int index,E e) 将给定的元素设置到指定的位置上,返回值为原位置上的元素.所以该操作是替换元素操作. 注:需在现有的元素上进行操作. 代码演示: