一、使用两个栈实现队列
思路:push:向stack1栈中压栈。
pop:如果stack2不为空,则stack2弹出一个值。如果stack2为空,则将stack1中全部元素一个一个的出栈,然后向stack2中压栈。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if (!stack2.empty())
{
int tmp = stack2.top();
stack2.pop();
return tmp;
}else{
while(!stack1.empty())
{
int tmp = stack1.top();
stack1.pop();
stack2.push(tmp);
}
int tmp = stack2.top();
stack2.pop();
return tmp;
}
}
private:
stack<int> stack1;
stack<int> stack2;
};
二、括号匹配
解法一:使用栈,遍历字符串,如果当前是( 、[、{ 则入栈。如果当前是) 、] 、} ,则必须与栈顶括号匹配,如果不匹配则直接返回false。
class Solution {
public:
/**
*
* @param s string字符串
* @return bool布尔型
*/
bool isValid(string s) {
// write code here
stack<char> stack1;
for(int i=0;i<s.size();i++)
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
{
stack1.push(s[i]);
}
else{
//栈不能为空!
if (stack1.empty())
{
return false;
}
char tmp = stack1.top();
stack1.pop();
if (s[i] == ')' && tmp != '(')
{
return false;
}else if (s[i] == ']' && tmp != '['){
return false;
}else if (s[i] == '}' && tmp != '{'){
return false;
}
}
}
return stack1.empty();
}
};
三、包含min函数的栈
要求:空间O(n) 、 各个函数操作时间O(1)。
思路:使用两个栈,一个栈存储所有元素,一个栈专门用来储存最小值。当入栈时,只有当value <= stack2.top()时才将其压入stack2栈。
class Solution {
public:
void push(int value) {
stack1.push(value);
if (stack2.empty())
{
stack2.push(value);
}else if(value <= stack2.top())
{
stack2.push(value);
}
}
void pop() {
if (stack1.top() == stack2.top())
{
stack2.pop();
}
stack1.pop();
}
int top() {
return stack1.top();
}
int min() {
return stack2.top();
}
private:
stack<int> stack1;
stack<int> stack2;
};