通过栈来实现队列

来源:互联网 发布:淘宝店招950x120 编辑:程序博客网 时间:2024/05/20 22:28

思路:这一类问题主要是考虑你的思路,算法本身应该并没有什么实际的应用(鄙人见少视浅,如果有具体的应用的地方,欢迎各位指出),其实这类问题之前也遇到过,如某概率产生器以p和1-p产生A,B,怎么构造出0.5的概率产生器。p和1-p怎么才能产生相等的关系呢,其实,我们知道p*(1-p) = (1-p)*p 所以我们简单的利用这个原理,就可以实现0.5的概率产生器。也就是产生AB和BA的概率总是相等的。我们只需要查看两次连续的输出值,将AA和BB丢弃,那么剩下的AB和BA的概率都是0.5.再如我们的字符串移位操作,AB要转为BA 怎么实现,(A'B')'  即将A,B分别转置后再整体转置,就可得到BA。
 
这里的思路也是一样:栈的性质正好与队列想反,好在我们有这样的概念,双重否定不就是肯定吗?所以我们就用两个栈来实现一个队列不就行啦……
 
/*
 *栈的特点是后进先出,队列的特点是先进先出。所以,用两个栈s1和s2模拟一个队列时,s1作输入栈,
 *逐个元素压栈,以此模拟队列元素的入队。当需要出队时,将栈s1退栈并逐个压入栈s2中,s1中最先
 *入栈的元素,在s2中处于栈顶。s2退栈,相当于队列的出队,实现了先进先出。显然,只有栈s2为空
 *且s1也为空,才算是队列空。算法中假定栈s1和栈s2容量相同。出队从栈s2出,当s2为空时,若s1
 *不空,则将s1倒入s2再出…
 */

#include "stdafx.h"#include<iostream.h>const int N = 20;class Stack{ public:  Stack();  bool Push(int);  bool Pop(int&);  bool StackEmpty();  bool StackFull(); private:  int num[N];  int top;};Stack::Stack(){ top = 0;}bool Stack::StackEmpty(){ return top == 0;}bool Stack::StackFull(){ return top == N-1;}bool Stack::Push(int e){  if(StackFull())  { cout<<"Error:Stack Full!"<<endl; return false;  }  num[top++] = e;    return true;}bool Stack::Pop(int& e){ if(StackEmpty()) {  cout<<"Error:Stack Empty!"<<endl;  return false; } e = num[--top]; return true;}class Queue{ public:  Queue(){};   bool EnQueue(int);  bool DelQueue(int&);  bool QueueEmpty();  bool QueueFull();     private:  Stack s1,s2;};bool Queue::QueueEmpty(){ if(s1.StackEmpty() && s2.StackEmpty())  return true; return false;}bool Queue::QueueFull(){ if(s1.StackFull())  return true; return false;}bool Queue::EnQueue(int e){ if(QueueFull()) {  cout<<"Error:Queue Full!"<<endl;  return false; } s1.Push(e); return true;}bool Queue::DelQueue(int& e){ if(QueueEmpty()) {  cout<<"Error:Queue Empty!"<<endl;  return false; } if(s2.StackEmpty()) {  while(!s1.StackEmpty())  {   int a;   s1.Pop(a);   s2.Push(a);  } } s2.Pop(e); return true;}void main(){ Queue q; q.EnQueue(1); q.EnQueue(2); q.EnQueue(3); q.EnQueue(4); q.EnQueue(5); int e; if(q.DelQueue(e)) cout<<e<<endl; if(q.DelQueue(e)) cout<<e<<endl; if(q.DelQueue(e)) cout<<e<<endl; if(q.DelQueue(e)) cout<<e<<endl; if(q.DelQueue(e)) cout<<e<<endl; if(q.DelQueue(e)) cout<<e<<endl; if(q.DelQueue(e)) cout<<e<<endl;} 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 移动硬盘插上显示要格式化怎么办 微信网络特别慢怎么办 苹果六网速太慢怎么办 小米手机wifi网速慢怎么办 苹果8蜂窝上网慢怎么办 苹果6s4g网速慢怎么办 苹果7上网速度慢怎么办 银行转账到别人账户怎么办 银行转账转错账户怎么办 人已故欠的公款怎么办 论文抄了表格数据怎么办 电子转账转错了怎么办 苹果手机付款方式有问题怎么办 合同中付款方式错怎么办? 优步付款方式无效怎么办 工程付款方式变更没有合同怎么办 银行账号被锁了怎么办? 街电押金退不了怎么办 佣金宝账号忘了怎么办 如果汇款汇错了怎么办 手机汇款汇错了怎么办 汇款时少了数字怎么办 打过流脑后发烧怎么办 甲醛公司除完后怎么办 发票系统导出的xml 怎么办 新买的书包味道太大怎么办 alt+a截图热键冲突怎么办 白背心领发黄了怎么办 房屋装修后出现质量问题怎么办 华为p9手机音量小怎么办 华为畅享8玩游戏卡怎么办 华为畅享7玩游戏卡怎么办 华为p9升级以后屏幕失灵怎么办 荣耀9青春版玩游戏卡怎么办 华为p9屏幕不亮了怎么办 华为p9入水黑屏怎么办 农信密码忘记了怎么办 小米4g信号差怎么办 手机的调频调制器坏了怎么办 调制解调器的灯一直闪怎么办 691宽带用户名和密码无效怎么办