题目一
【用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型】
1、分析:在添加数据的时候直接使用 push 即可。主要是出栈的操作时要根据stack2 的状态来进行不同的处理
- 当stack2为空时,要先将stack1中的所有元素全部压入stack中,此时stack2中的元素将满足队列的先进先出。
- 当stack2不为空时,可以直接将其弹出即可。
2、代码如下
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
//当stack2为空时,先直接将stack1中的所有元素压入到stack2中。否则直接将stack2中的元素弹出
if(stack2.empty())
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
int topElem=stack2.top();
stack2.pop();
return topElem;
}
private:
stack<int> stack1;
stack<int> stack2;
};
题目二:包含min函数的栈
1、分析:首先使用辅助栈来保存每次压入到数据栈中的元素的最小值
2、代码
class Solution {
public:
stack<int> m_data; // 存放数据的栈
stack<int> m_min; // 存放最小值的栈
void push(int value) {
m_data.push(value);
if(m_min.size()==0||value<m_min.top())
{
m_min.push(value);
}
else
{
m_min.push(m_min.top());
}
}
void pop() {
if(m_data.size()<=0 || m_min.size()<=0)
return;
m_data.pop();
m_min.pop();
}
int top() {
if(m_data.size()>0 && m_min.size()>0)
{
return m_data.top();
}
}
int min() {
if(m_data.size()>0 && m_min.size()>0)
{
return m_min.top();
}
}
};
题三、栈的压入弹出顺序
1、分析:
首先建立一个辅助栈,将压入顺序的第一个元素放入其中,此时判断:当该栈的栈顶元素与弹出顺序的第一个元素是否相同,若相同则直接弹出,否则将未入栈拿到数字依次的压入栈中,直到栈顶的元素与第二个序列的下一个元素相同为止。若始终未找到该元素则该序列不可能是该栈的出栈序列。
2、代码
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int pushLen=pushV.size(),popLen=popV.size();
stack<int> s; // 创建辅助栈
if(pushLen!=popLen||pushLen<=0||popLen<=0)
return false;
int pushIndex=0,popIndex=0;
s.push(pushV[0]);
for(pushIndex,popIndex ; pushIndex<pushLen && popIndex<popLen ;)
{
//若栈顶元素与出栈序列的下一个元素相同,则弹出
if(!s.empty() && s.top()==popV[popIndex])
{
s.pop();
++popIndex;
}
else
{
s.push(pushV[++pushIndex]); //模拟入栈
}
}
if(s.empty())
return true;
else
return false;
}
};