1、使用两个栈实现一个队列
最近一直再重温c++,就把最近遇到的题目和自己写的代码都记录下来吧,自己也可以复习
问题:使用两个栈实现一个队列
很经典的c++与数据结构问题,首先有思路一定要求得对栈和队列足够熟悉,我这里对于基础知识就不多展开了,上网搜或看《数据结构c语言版》。
代码:
#include<iostream>
#include<stack> //STL容器栈
//#include<queue> //队列
using namespace std;
//两个栈实现队列
//第一个栈相当于进行倒置,然后从上往下压入栈2,从栈2再弹出
class solution
{
public:
stack<int> s1;
stack<int> s2;
void push(int node){
s1.push(node);
}
int pop(){
//当s2不为空时,将s1压入到s2
if(s2.empty())
{
while(!s1.empty())
{int a=s1.top();
s2.push(a);
s1.pop();}
}
//弹出s2,此时即为队列的弹出
int b=s2.top();
s2.pop();
return b;
}
};
int main()
{
solution ss;
ss.push(7);
ss.push(77);
ss.push(777);
cout<<ss.pop()<<endl;
cout<<ss.pop()<<endl;
}
结果
逐一压入7,77,777,按照First in First out得,结果正确
…
2、第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序
代码
/*输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。*/
/*思想:借助一个辅助栈来模拟出栈的过程,遍历入栈顺序,压入辅助栈,判断辅助栈栈顶与
出栈的顺序是否一样,不一样继续入栈,最后看辅助栈是否为空*/
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()==0 || popV.size()==0)
return false;
stack<int> assist_stack;
for(int i=0,j=0;i<pushV.size();i++)
{
assist_stack.push(pushV[i]);
//利用了while中的pop,所以需要判断是否为空
while(!assist_stack.empty() && assist_stack.top()==popV[j])
{ assist_stack.pop();
j++; }
}
return assist_stack.empty();
}
};