1. 两个栈实现一个队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
题目分析
push操作就直接往stack1中push, pop操作需要分类一下:如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop,如果stack2不为空,直接pop就ok。
C++ 代码
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty())
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
int ret = stack2.top();
stack2.pop();
return ret;
}
private:
stack<int> stack1;
stack<int> stack2;
};
2. 栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
题目分析
方法:模拟法
直接模拟即可。因为弹出之前的值都会先入栈,所以这里用个栈来辅助。
- 初始化:用指针i指向pushV的第一个位置, 指针j指向popV的第一个位置
- 如果pushV[i] != popV[j], 那么应该将pushV[i]放入栈中, ++i
- 否则,pushV[i]==popV[j], 说明这个元素是放入栈中立马弹出,所以,++i, ++j,然后应该检查popV[j]与栈顶元素是否相等,如果相等,++j, 并且弹出栈顶元素
- 重复2,3, 如果i==pushV.size(), 说明入栈序列访问完,此时检查栈是否为空,如果为空,说明匹配,否则不匹配。
C++代码
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
stack<int> sk;
int i = 0 ,j = 0;
while(i < pushV.size())
{
if(pushV[i] != popV[j])
{
sk.push(pushV[i]);
i++;
}
else{
i++;
j++;
while(!sk.empty() && sk.top() == popV[j])
{
sk.pop();
j++;;
}
}
}
return sk.empty();
}
};
3. 包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
题目分析
题目抽象:要求实现一个O(1)时间复杂度的返回最小值的栈。正常情况下,栈的push,pop操作都为O(1),
但是返回最小值,需要遍历整个栈,时间复杂度为O(n),所以这里需要空间换时间的思想。
方法:使用辅助栈
首先需要一个正常栈normal,用于栈的正常操作,然后需要一个辅助栈minval,专门用于获取最小值,
C++代码
class Solution {
public:
stack<int> sk, minsk;
void push(int value) {
sk.push(value);
if(minsk.empty())
{
minsk.push(value);
}else{
if(value < minsk.top())
{
minsk.push(value);
}else{
minsk.push(minsk.top());
}
}
}
void pop() {
sk.pop();
minsk.pop();
}
int top() {
return sk.top();
}
int min() {
return minsk.top();
}
};