DAY10 - 232.用栈实现队列, 225. 用队列实现栈, 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项
由于栈(队列)底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能),所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。
C++ STL stack
push():将元素压入栈顶。pop():将栈顶元素弹出。top():访问栈顶元素。empty():检查栈是否为空。size():返回栈中元素的数量。
C++ STL queue
push():将元素加入队列的尾部。pop():将队列的头部元素移除。front():访问队列头部元素。back():访问队列尾部元素。empty():检查队列是否为空。size():返回队列中元素的数量。
232.用栈实现队列
知道两个栈尾尾相接就可以实现队列了,但实现起来还是卡了一下。
class MyQueue {
public:
stack<int> fronts;
stack<int> tails;
MyQueue() {
}
void push(int x) {
tails.push(x);
}
int pop() {
if(fronts.empty()){ //注意这里是fronts为空才可以操作,否则顺序就乱了
while(!tails.empty()){
fronts.push(tails.top());
tails.pop();
}
}
int res=fronts.top();
fronts.pop();
return res;
}
int peek() {
if(fronts.empty()){
while(!tails.empty()){
fronts.push(tails.top());
tails.pop();
}
}
return fronts.top();
}
bool empty() {
return fronts.empty()&&tails.empty();
}
};
225. 用队列实现栈
队列FIFO,所以即使出队列再入队列顺序也不会改变。而两个栈先弹出再放入顺序就会反转。
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 result = que.front();
que.pop();
return result;
}
int top(){
int size = que.size();
size--;
while (size--){
que.push(que.front());
que.pop();
}
int result = que.front();
que.push(que.front());
que.pop();
return result;
}
bool empty() {
return que.empty();
}
};
20. 有效的括号
一开始面试写了这个题,用的vector没有用stack,换成stack来写一遍
class Solution {
public:
bool isValid(string s) {
stack<char> st;
int len=s.size();
for(char c:s){
if(c=='('||c=='['||c=='{'){
st.push(c);
}else if(c==')'){
if(!st.empty()&&st.top()=='(') st.pop();
else return false;
}else if(c==']'){
if(!st.empty()&&st.top()=='[') st.pop();
else return false;
}else if(c=='}'){
if(!st.empty()&&st.top()=='{') st.pop();
else return false;
}
}
if(!st.empty()) return false;
return true;
}
};
但是这样写if else太多了,很不美观,看下标准答案:
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
stack<char> st;
for (char c:s) {
if (c == '(') st.push(')');
else if (c == '{') st.push('}');
else if (c == '[') st.push(']'); //让左括号入栈
//如果在过程中st空了则也是错误
else if (st.empty() || st.top() != c) return false;
else st.pop();
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
和括号匹配一样,不过是将栈中剩余的内容再输出而已。还要注意的一个小点是由于栈是FIFO,所以最后res字符串要reverse一下。
class Solution {
public:
string removeDuplicates(string s) {
stack<char> st;
for(char c:s){
if(!st.empty()&&c==st.top()) st.pop();
else st.push(c);
}
string res="";
while(!st.empty()){
res+=st.top();
st.pop();
}
reverse(res.begin(),res.end());
return res;
}
};
浙公网安备 33010602011771号