232.用栈实现队列
//理解2个栈 一个栈弹出后再入另一个栈,再弹出即可实现队列效果。
std::stack<int> stack_1;
std::stack<int> stack_2;
MyQueue() {
}
void push(int x) {
stack_1.push(x);
}
int pop() {
//必须先把stack_2中清空,再将stack_1中的入栈,这样符合队列的逻辑
if(stack_2.empty()){
while(!stack_1.empty()){
stack_2.push(stack_1.top());
stack_1.pop();
}
}
int result = stack_2.top();
stack_2.pop();
return result;
}
int peek() {
//先调用pop弹出栈顶元素,然后将该元素再入栈
int result = this->pop();
stack_2.push(result);
return result;
}
bool empty() {
return stack_1.empty() && stack_2.empty();
}
225.用队列实现栈
//需理解两个队列无法像上题中的两个栈表示队列一样表示栈,因为先进后出在队列中不好实现,需用队列2来保存队列1中的前几个元素,队列1输出最后一个元素后再将队列2复制给队列1
std::queue<int> queue_1;
std::queue<int> queue_2;
MyStack() {
}
void push(int x) {
queue_1.push(x);
}
int pop() {
int size = queue_1.size();
size--;
while(size--){
queue_2.push(queue_1.front());
queue_1.pop();
}
int result = queue_1.front();
queue_1.pop();
queue_1 = queue_2;
while (!queue_2.empty()){
// 注意清空que2
queue_2.pop();
}
return result;
}
int top() {
int size = queue_1.size();
size--;
while(size--){
queue_2.push(queue_1.front());
queue_1.pop();
}
int result = queue_1.front();
queue_2.push(result);
queue_1.pop();
queue_1 = queue_2;
while (!queue_2.empty()){
// 注意清空que2
queue_2.pop();
}
return result;
}
bool empty() {
return queue_1.empty();
}
20.有效的括号
//需理解栈在括号匹配时的作用 1中间的左括号和右括号不匹配即栈顶元素(表示左括号要匹配的右括号)和当前值不相同,2左括号没有匹配的右括号即formatter不为空,3右括号没有匹配的左括号即当前值时formatter为空
bool isValid(string s) {
std::stack<char> formatter;
for(int i = 0; i < s.size(); i ++){
if(s[i]=='('){
formatter.push(')');
}else if(s[i]=='{'){
formatter.push('}');
}else if(s[i]=='['){
formatter.push(']');
}else {
if(formatter.empty() || formatter.top() != s[i]){
return false;
}else{
formatter.pop();
}
}
}
return formatter.empty();
}
1047.删除字符串中的所有相邻重复项
//需理解如何用栈来解决匹配问题
string removeDuplicates(string s) {
std::stack<char> formatter;
for(int i = 0; i < s.size(); i++){
if(!formatter.empty() && formatter.top() == s[i]){
formatter.pop();
}else{
formatter.push(s[i]);
}
}
string result;
while(!formatter.empty()){
result += formatter.top();
formatter.pop();
}
reverse(result.begin(), result.end());
return result;
}