两个队列实现一个栈

在C++ STL中有双向队列deque,当单向的来用就行,设有两个队列A和B,栈的push操作,直接push到A的队尾就行了。栈的pop操作时,将A中的队列依次取出放到B中,取到最后一个时,最后一个不要放到B中,直接删掉,再将B中的值依次放回A中。栈的top操作时,将A中的队列依次取出放到B中,取到最后一个时,将最后一个值记录下来,再将最后一个值放到B中,再将B中的值依次放回到A中。

  
  
  1. #include<stdafx.h>  
  2. #include<iostream>  
  3. #include <deque>  
  4. using namespace std;  
  5. template<class T> class Mystack  
  6. {  
  7. public:  
  8.     Mystack(){}  
  9.     ~Mystack(){}  
  10.     void push(T t);  
  11.     T top();  
  12.     void pop();  
  13. private:  
  14.     deque<T> A;  
  15.     deque<T> B;  
  16.  
  17. };  
  18.  
  19. template<class T> void  Mystack<T>::push(T t)  
  20. {  
  21.     A.push_back(t);  
  22. }  
  23. template<class T> T Mystack<T>::top()  
  24. {  
  25.     while(A.size()>1)  
  26.     {  
  27.         B.push_back(A.front());  
  28.         A.pop_front();  
  29.     }  
  30.  
  31.     T tmp=A.front();  
  32.     B.push_back(A.front());  
  33.  
  34.     A.pop_front();  
  35.     while(B.size()!=0)  
  36.     {  
  37.         A.push_back(B.front());  
  38.         B.pop_front();  
  39.     }  
  40.     return tmp;  
  41. }  
  42. template<class T> void Mystack<T>::pop()  
  43. {  
  44.     while(A.size()>1)  
  45.     {  
  46.         B.push_back(A.front());  
  47.         A.pop_front();  
  48.     }  
  49.     A.pop_front();  
  50.     while(B.size()!=0)  
  51.     {  
  52.         A.push_back(B.front());  
  53.         B.pop_front();  
  54.     }  
  55.  
  56.  
  57. }  
  58. void main()  
  59. {  
  60.     Mystack<int> a;  
  61.     for(int i=0;i<10;i++)  
  62.         a.push(i);  
  63.     for(int i=0;i<10;i++)  
  64.     {  
  65.         cout<<a.top()<<endl;  
  66.         a.pop();  
  67.     }  
  68.       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以用两个队列来模拟一个的数据结构,具体实现如下: 1. 定义两个队列queue1和queue2; 2. 将元素压入时,将元素放入queue1中; 3. 将元素弹出时,先将queue1中的元素依次出队并放入queue2中,直到queue1中只剩一个元素,将该元素出队返回即可; 4. 在弹出元素时,如果queue1中只有一个元素,直接出队返回即可,不需要将元素放入queue2中; 5. 在弹出元素时,交换queue1和queue2的指针,使得下一次弹出时可以从另一个队列中取出元素; 6. 使用两个队列实现,其空间复杂度为O(n),其中n为中元素的个数。 以下是使用C语言实现的代码: ``` #include <stdio.h> #include <stdlib.h> typedef struct Queue { int* data; int front; int rear; } Queue; typedef struct Stack { Queue* queue1; Queue* queue2; } Stack; Queue* createQueue(int size) { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->data = (int*)malloc(sizeof(int) * size); queue->front = 0; queue->rear = 0; return queue; } Stack* createStack(int size) { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->queue1 = createQueue(size); stack->queue2 = createQueue(size); return stack; } void push(Stack* stack, int value) { stack->queue1->data[stack->queue1->rear] = value; stack->queue1->rear++; } int pop(Stack* stack) { int value = 0; if(stack->queue1->front == stack->queue1->rear) { printf("Stack is empty.\n"); return -1; } while(stack->queue1->front < stack->queue1->rear - 1) { stack->queue2->data[stack->queue2->rear] = stack->queue1->data[stack->queue1->front]; stack->queue1->front++; stack->queue2->rear++; } value = stack->queue1->data[stack->queue1->front]; stack->queue1->front++; Queue* temp = stack->queue1; stack->queue1 = stack->queue2; stack->queue2 = temp; return value; } int main() { Stack* stack = createStack(10); push(stack, 1); push(stack, 2); push(stack, 3); printf("%d\n", pop(stack)); push(stack, 4); printf("%d\n", pop(stack)); printf("%d\n", pop(stack)); printf("%d\n", pop(stack)); printf("%d\n", pop(stack)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值