232.用栈实现队列
题目链接https://leetcode.cn/problems/implement-queue-using-stacks/
push的要求是把队列的往队列的栈顶添加元素,用栈来实现简直就是老天爷赏饭吃,直接push就完事了
class MyQueue {
public:
stack<int> sin;
stack<int> sout;
MyQueue() {
}
void push(int x) {
sin.push(x);
}
int pop() {
if(sout.empty()){//题目给的数据没有空的这道题里面这个条件有没有没影响
while(!sin.empty()){//只要sin还有元素就往sout里面push元素
sout.push(sin.top());
sin.pop();
}
}
int res=sout.top();
sout.pop();
return res;
}
int peek() {
int res=this->pop();
sout.push(res);
return res;//题目要求是只返回栈顶元素,pop会把栈顶去掉所以一定要记得把栈顶的元素加回去
}
bool empty() {
return sin.empty()&&sout.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.用队列实现栈
题目链接https://leetcode.cn/problems/implement-stack-using-queues/description/
while(size--)和while(--size)两种循环while(size--)循环会执行size次,而while(--size)会执行size-1次,要看具体需求来用这两种循环。
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size=que.size();
size--;
while(size--){//循环size次
int top=que.front();//反复把队列第一个元素放最后
que.pop();
que.push(top);
}
int top=que.front();
que.pop();//寻找的栈顶元素pop并返回
return top;
}
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.有效的括号
题目链接https://leetcode.cn/problems/valid-parentheses/description/
一共有三种情况
1、左括号多了
2、右括号多了
3、左右括号不匹配
class Solution {
public:
bool isValid(string s) {
stack<char> br;
if(s.size()%2!=0){//剪枝,如果是奇数直接返回
return 0;
}
for(int i=0;i<s.size();i++){
if(s[i]=='[')br.push(']');
else if(s[i]=='(')br.push(')');
else if(s[i]=='{')br.push('}');
else if(br.empty()||s[i]!=br.top())return 0;//右括号多了,和括号不匹配
else br.pop();//else if(br.top()==s[i])br.pop();相等的时候消了
}
return br.empty();
}
};
1047.删除字符串中所有相邻重复项
题目链接https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/description/
这道消消乐题简直精简得离谱
把字符串当栈来用如果和字符不相等就放后面,相等就把这个字符都弹出,最后直接返回字符串
字符串的循环是
class Solution {
public:
string removeDuplicates(string s) {
string res;
for(char str:s){//遍历字符串里的每一项,用str代表(范围基的for循环)
if(res.empty()||str!=res.back()){
res.push_back(str);
}
else
res.pop_back();
}
return res;
}
};