这次有三道题,不过都是难度为简单的题目
用队列实现栈
class MyStack {
public:
queue<int> que;
MyStack() {
}
void push(int x) {
que.push(x);
}
int pop() {
int size = que.size();
size--;
//因为要返回栈顶元素,所以先减一个,这样留下来的最后一个队列元素是队列的最后一个,也就是栈的栈顶元素
while(size--) {
//que.pop(que.front());
que.push(que.front());
que.pop();
}
//输出栈顶元素并弹出
int res = que.front();
que.pop();
return res;
}
int top() {
//栈顶元素就是队列的最后一个元素
return que.back();
}
bool empty() {
return que.empty();
}
};
class MyQueue {
public:
stack<int> skIn;
stack<int> skOut;
MyQueue() {
}
void push(int x) {
skIn.push(x);
}
//先判断第二个栈是否为空,如果为空的话,把第一个栈的数据全输进第二个栈
//这样第二个栈的元素顺序就反过来了,相当于一个队列,再输出第二个栈的栈顶元素,相当于队列的第一个元素
int pop() {
if(skOut.empty()) {
while(!skIn.empty()) {
skOut.push(skIn.top());
skIn.pop();
}
}
int res = skOut.top();
skOut.pop();
return res;
}
int peek() {
//调用自己的函数,将第二个栈的栈顶输出并弹出,然后再把该栈顶压入栈,就不会删除元素了
int res = this->pop();
skOut.push(res);
return res;
}
bool empty() {
return skIn.empty() && skOut.empty();
}
};
class Solution {
public:
bool isValid(string s) {
stack<int> sk;
//遍历字符串s
//当字符串遍历完后,栈为空的时候就是有效的括号
for(int i=0; i<s.size(); i++) {
if(s[i] == '(') {
sk.push(')');
}else if(s[i] == '[') {
sk.push(']');
}else if(s[i] == '{') {
sk.push('}');
}else if(sk.empty() || sk.top() != s[i]) {
return false;
}else {
sk.pop();
}
}
return sk.empty();
}
};