栈与队列【每日一题】
来源:互联网 发布:制作音效的软件 编辑:程序博客网 时间:2024/05/24 07:34
1.两个栈实现一个队列:
思路一、s1是入栈的,s2是出栈的
入队列:直接压到s1里
出队列:先把s1中的元素全部压到s2中,弹出s2中的栈顶元素;
再把s2的所有元素压回s1中
思路二、s1是入栈的,s2是出栈的
入队列:如果s1为空,把s2中所有元素压到s1中;否则直接压入s1
出队列:如果s2不为空,把s2的栈顶元素直接弹出;否则把s1所有
元素全部弹出压入s2中,再弹出s2栈顶元素
思路三、s1是入栈的,s2是出栈的
入队列:直接压入s1即可
出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则把s1
的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
#include <iostream>#include <stack>using namespace std;template <typename T> class CQueue{public: CQueue() {} ~CQueue() {} void appendTail(const T& node) { s1.push (node); cout<<node<<"->"; } T deleteHead() { if(s2.size () <= 0) { while(s1.size () > 0) { T& data = s1.top (); s1.pop (); s2.push (data); } } if(s2.size () == 0) cout<<"队列为空!"<<endl; T head = s2.top (); s2.pop (); cout<<head<<"->"; return head; }private: stack<T> s1; stack<T> s2;};int main(){ CQueue<int> q; cout<<"原队列:"<<endl; q.appendTail (1); q.appendTail (2); q.appendTail (3); q.appendTail (4); cout<<endl; cout<<"出队列元素:"; q.deleteHead (); cout<<endl; cout<<"插入队列元素:"<<endl; q.appendTail (5); q.appendTail (6); q.appendTail (7); cout<<endl; cout<<"出队列元素:"; q.deleteHead (); q.deleteHead (); q.deleteHead (); q.deleteHead (); cout<<endl; return 0;}
2.两个队列实现一个栈
算法思路:
现有两个队列q1与q2,入栈:如果q1与q2都为空,那么我们选择q1入栈也就是入队列,比如q1入栈 1 2 3 4 ;现在要出栈,后进先出那么4要出栈。但是q1是一个队列,先进先出,那么 1 2 3出队列 q2 1 2 3 入队列,q1中此时剩余4,把4出对列达到出栈的效果。 这个时候如果我们又加入一个元素5,那么我们应该把5放到q1还是q2,因为现在q2中有 1 2 3,把5放到q1不方便统计,所以要把5放入到q2;如果5放到了q1,等下编写出栈的代码很麻烦,如果放到q2我们只需要分类:q2是不是为空,为空的为一种情况,不为空的为一种情况。
所以最后:
如果q1与q2都为空,那么往q1中插入元素
如果q1不为空,那么往q1中插入元素
如果q2不为空,那么往q1中插入元素
#include <iostream> #include <queue> using namespace std; template <class T>class CStack{public: CStack() {} ~CStack() {} void appendTail(const T& node) { if(q1.size ()==0 && q2.size () == 0)//如果q1与q2都为空,那么往q1中插入元素 q1.push (node); else if(q1.size () > 0)//如果q1不为空,那么往q1中插入元素 q1.push (node); else if(q2.size()>0)//如果q2不为空,那么往q1中插入元素 q2.push(node); cout<<node<<"->"; } T deleteTail() { T Tail; if(q2.size () == 0) { while(q1.size () != 1) { T& data = q1.front (); q1.pop (); q2.push (data); } Tail = q1.front (); q1.pop (); cout<<Tail<<endl; } return Tail; }private: queue<T> q1; queue<T> q2;}; int main(){ CStack<int> s; s.appendTail (1); s.appendTail (2); s.appendTail (3); s.appendTail (4); s.appendTail (5); s.appendTail (6); s.deleteTail (); s.deleteTail (); return 0;}
- 栈与队列【每日一题】
- 【每日一题-6】栈和队列与替换空格
- 每日一题之队列与栈的相互实现
- 每日一题(36) - 用两个栈实现队列
- 每日一题(37) - 两个队列实现栈
- 每日一题19:循环队列
- 每日一题——栈实现队列,队列实现栈
- 每日一题15:双端队列与自调整表
- 【每日算法】栈&队列
- 每日一题(63) - 排列与组合
- 每日一题22:Deque与Trait
- 每日一题18:栈
- 每日一练——用两个栈实现队列&用两个队列实现栈
- (一)栈与队列
- 每日一题(33)——用两个栈实现一个队列的功能?要求给出算法和思路
- 用栈实现队列(每日一道算法题)
- 每日一题之栈的实现
- 每日一题2
- 1083. Moving Tables
- Error:referenced from;symbol(s) not found for architecture x86_64解决
- 【数据库系统概念】第1-3章 数据库基础知识入门 知识总结
- SSH——上传单个图片
- Spark源码--Stage
- 栈与队列【每日一题】
- Linux下批量Kill多个进程
- 转) 关于lua table是否为空的判断
- PAT (Advanced Level) Practise 1043 Is It a Binary Search Tree (25)
- HTML5中了不起的离线应用
- C++类库bitset<>简介
- linux修改Ubuntu的aptget源
- POJ 3067 Japan 笔记
- Android如何让APP进程常驻内存?