代码随想录第11天
232. 用栈实现队列
题目
链接: link
题解
class MyQueue {
public:
stack<int> stackIn;
stack<int> stackOut;
MyQueue() {
}
void push(int x) {
stackIn.push(x);
}
int pop() {
if(stackOut.empty())
{
int len = stackIn.size();
for(int i = 0;i < len;i++)
{
int temp = stackIn.top();
stackOut.push(temp);
stackIn.pop();
}
}
int temp = stackOut.top();
stackOut.pop();
return temp;
}
int peek() {
int result = this->pop();
stackOut.push(result);
return result;
}
bool empty() {
if(stackIn.empty() && stackOut.empty())
return true;
else
return false;
}
};
注意
1.在pop()函数中,stackIn的大小会随着循环体内部的pop()执行而减小,因此不可以直接将 i < stackIn.size() 作为循环终止条件
225. 用队列实现栈
题目
链接: link
注意
1.队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。
用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。
que1 = que2; // 再将que2赋值给que1
while (!que2.empty()) { // 清空que2
que2.pop();
}
20. 有效的括号
题目
链接: link
注意
1.思路:先模拟无效的场景:
①字符串里左方向的括号多余了 ,所以不匹配。
已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
②括号没有多余,但是 括号的类型没有匹配上。
遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return falses
③历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
字符串里右方向的括号多余了,所以不匹配。
2.在匹配左括号的时候,右括号先入栈
优点:就只需要比较当前元素和栈顶相不相等就可以
//右括号先入栈
else if (st.empty() || st.top() != s[i]) return false;
//左括号先入栈
else if(s[i] == '}' )
{
if(st.empty() == false && st.top() == '{')
st.pop();
else
return false;
}
else if(s[i] == ']')
{
if(st.empty() == false && st.top() == '[')
st.pop();
else
return false;
}
else if(s[i] == ')')
{
if(st.empty() == false && st.top() == '(')
st.pop();
else
return false;
}