用两个栈模拟队列

来源:互联网 发布:淘宝多少钱可以分期购 编辑:程序博客网 时间:2024/05/16 17:15
[cpp] view plaincopy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. using namespace std;  
  4. //用栈模拟队列  
  5. class Data{  
  6. public:  
  7.     Data():data(0),next(NULL){}  
  8.     Data(int i):data(i),next(NULL){}  
  9.     int data;  
  10.     Data *next;  
  11. };  
  12. class Stack{  
  13. public:  
  14.     Stack():Top(NULL){}  
  15.     void Push(Data i);  
  16.     void Pop(Data &d);  
  17.     bool IsEmpty();  
  18.     void Print();  
  19. private:  
  20.     Data *Top;  
  21. };  
  22.   
  23. //进栈  
  24. void Stack::Push(Data d){  
  25.     Data *p=new Data(d.data);  
  26.     if (IsEmpty()){ //如果栈为空  
  27.         Top=p;  
  28.     }else//新节点成为栈顶节点  
  29.         p->next=Top;  
  30.         Top=p;  
  31.     }  
  32. }  
  33. //出栈  
  34. void Stack::Pop(Data &s){  
  35.     if (IsEmpty()){//如果为空栈  
  36.         cout<<"Stack Empty!"<<endl;  
  37.         getchar();  
  38.         exit(1);  
  39.     }else{  
  40.         s.data=Top->data;  
  41.         Top=Top->next;  
  42.     }  
  43. }  
  44. //判断是否为空  
  45. bool Stack::IsEmpty(){  
  46.     if (Top==NULL){  
  47.         return 1;  
  48.     }  
  49.     else  
  50.         return 0;  
  51. }  
  52. //打印  
  53. void Stack::Print(){  
  54.     Data *p=Top;  
  55.     while (p!=NULL){  
  56.         cout<<p->data<<" ";  
  57.         p=p->next;  
  58.     }  
  59.     cout<<endl;  
  60. }  
  61.   
  62. class Queue{  
  63. public:  
  64.     void enqueue(Data d); //入队  
  65.     void dequeue(Data &d); //出队  
  66.     bool IsEmpty();//是否为空  
  67. private:  
  68.     Stack s1;//用于入队  
  69.     Stack s2;//用于出队  
  70. };  
  71. //入队  
  72. void Queue::enqueue(Data d){  
  73.     s1.Push(d);//只对s1进行进栈操作  
  74. }  
  75. //出队  
  76. void Queue::dequeue(Data &d){  
  77.     Data temp(0);//局部变量,用于临时存储  
  78.     if (s2.IsEmpty())//如果s2为空,把s1的所有元素push到s2中  
  79.         while (!s1.IsEmpty()){  
  80.           s1.Pop(temp); //弹出s1的元素  
  81.           s2.Push(temp);//压入s2中  
  82.          }  
  83.      if(!s2.IsEmpty()){ //如果s2不为空  
  84.             //此时如果s2不为空,弹出s2的栈顶元素  
  85.             s2.Pop(d);  
  86.         }  
  87.           
  88. }  
  89. //队列判空  
  90. bool Queue::IsEmpty(){  
  91.     //如果两个栈都为空,则返回1,否则返回0  
  92.     if (s1.IsEmpty() && s2.IsEmpty()){  
  93.         return 1;  
  94.     }  
  95.     else  
  96.         return 0;  
  97. }  
  98.   
  99. int _tmain(int argc, _TCHAR* argv[])  
  100. {  
  101.     Data data(0);//定义一个节点  
  102.     Queue q;  
  103.     q.enqueue(Data(1));  
  104.     q.enqueue(Data(2));  
  105.     q.enqueue(Data(3));  
  106.   
  107.     q.dequeue(data);  
  108.     cout<<"dequeue "<<data.data<<endl;  
  109.     q.enqueue(Data(4));  
  110.     q.dequeue(data);  
  111.     cout<<"dequeue "<<data.data<<endl;  
  112.     q.dequeue(data);  
  113.     cout<<"dequeue "<<data.data<<endl;  
  114.     cout<<"IsEmpty "<<q.IsEmpty()<<endl;  
  115.     q.dequeue(data);  
  116.     cout<<"dequeue "<<data.data<<endl;  
  117.     cout<<"IsEmpty "<<q.IsEmpty()<<endl;  
  118.     system("pause");  
  119.     return 0;  
  120. }  
原创粉丝点击