232.用栈实现队列
思路:用双栈来模拟队列
代码:
class MyQueue {
public:
stack<int> stIn;
stack<int> stOut;
MyQueue() {
}
void push(int x) {
stIn.push(x);
}
int pop() {
if(stOut.empty()){
while(!stIn.empty()){
int tem=stIn.top();
stIn.pop();
stOut.push(tem);
}
}
int res=stOut.top();
stOut.pop();
return res;
}
int peek() {
int tem=this->pop();
stOut.push(tem);
return tem;
}
bool empty() {
return stIn.empty()&&stOut.empty();
}
};
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue* obj = new MyQueue();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->empty();
*/
225. 用队列实现栈
思路:使用一个队列来模拟栈,出栈时将出栈元素前所有元素移到后面。
代码:
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size=que.size();
size--;
while(size--){
que.push(que.front());
que.pop();
}
int res=que.front();
que.pop();
return res;
}
int top() {
return que.back();
}
bool empty() {
return que.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
20. 有效的括号
思路:使用栈出现左括号存相应的右括号,实现消消乐。
代码:
class Solution {
public:
bool isValid(string s) {
stack<char> sta;
for(int i=0;i<s.size();++i){
if(s[i]=='('){
sta.push(')');
}
else if(s[i]=='['){
sta.push(']');
}
else if(s[i]=='{'){
sta.push('}');
}
else{
if(sta.empty())
return false;
else if(sta.top()!=s[i])
return false;
else
sta.pop();
}
}
return sta.empty();
}
};
1047. 删除字符串中的所有相邻重复项
思路:同上,也是使用栈实现消消乐。
代码:
class Solution {
public:
string removeDuplicates(string s) {
stack<char> sta;
for(int i=0;i<s.size();++i){
if(sta.empty()||sta.top()!=s[i])
sta.push(s[i]);
else
sta.pop();
}
s.resize(sta.size());
for(int i=s.size()-1;i>=0;--i){
s[i]=sta.top();
sta.pop();
}
return s;
}
};