232.用栈实现队列
题目描述
思路分析
两个stack,stack1存数据,之后压入另一个stack2
实现queue先进先出功能。
代码
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()){
stOut.push(stIn.top());
stIn.pop();
}
}
int result = stOut.top();
stOut.pop();
return result;
}
int peek() {
int res = this->pop();
stOut.push(res);
return res;
}
bool empty() {
return stOut.empty() && stIn.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. 用队列实现栈
题目描述
思路分析
- 双queue存储
其中一个队列存储 - 单queue
一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时在去弹出元素就是栈的顺序
代码
- 双队列
class MyStack {
public:
queue<int> que1;
queue<int> que2;
MyStack() {
}
void push(int x) {
que1.push(x);
}
int pop() {
int size = que1.size();
size--;
while(size--){
que2.push(que1.front());
que1.pop();
}
int result = que1.front();
que1.pop();
que1 = que2;
while (!que2.empty()){
que2.pop();
}
return result;
}
int top() {
return que1.back();
}
bool empty() {
return que1.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();
*/
- 单队列
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() {
return que.back();
}
bool empty() {
return que.empty();
}
};
20. 有效的括号
题目描述
思路分析
三种不匹配情况
- 字符串里左方向的括号多余了
已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false - 括号没有多余,但是 括号的类型没有匹配上
遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false - 字符串里右方向的括号多余了
遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
代码
class Solution {
public:
bool isValid(string s) {
int size = s.size();
if (size % 2 == 1) return false;
stack<char> st;
for (int i = 0; i < size; ++i) {
if (s[i] == '(') st.push(')');
else if (s[i] == '{') st.push('}');
else if (s[i] == '[') st.push(']');
else if (st.empty() || s[i] != st.top()) return false;
else st.pop();
}
return st.empty();
}
};
1047. 删除字符串中的所有相邻重复项
题目描述
思路分析
- 删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,寻找是否遍历过一样数值的元素
- 栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。
可以直接用栈来操作,也可以用另一个字符串模拟stack的功能。
代码
- 栈操作
class Solution {
public:
string removeDuplicates(string s) {
stack<int> st;
for (char c : s) {
if (st.empty() || c != st.top()) {
st.push(c);
}else {
st.pop();
}
}
string result = "";
while (!st.empty()) {
result += st.top();
st.pop();
}
reverse(result.begin(),result.end());
return result;
}
};
- 字符串模拟
class Solution {
public:
string removeDuplicates(string s) {
string result;
for (char c : s) {
if (result.empty() || c != result.back()) {
result.push_back(c);
}else {
result.pop_back();
}
}
return result;
}
};