代码随想录第十天: 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

 232.用栈实现队列:比较简单没什么说的,代码如下:

#include <stack>

using namespace std;

class MyQueue
{
public:
    stack<int> stackin,stackout;
    MyQueue(){};
    
    void push(int a){
        stackin.push(a);
    }

    void pop(){
        if (stackout.empty())
        {
            while (!stackin.empty())
            {
                stackout.push(stackin.top());
                stackin.pop();
            }
        }
        int result = stackout.top();
        stackout.pop();
    }

    int peek(){
        if (stackout.empty())
        {
            while (!stackin.empty())
            {
                stackout.push(stackin.top());
                stackin.pop();
            }
        }
        return stackout.top();
    }
    
    bool empty(){
        return stackin.empty() && stackout.empty();
    }

};

225. 用队列实现栈,代码如下:

#include <queue>

using namespace std;

class MyStack
{
public:
   queue<int> que1,que2;

   MyStack(){};

   void push(int a){
      que1.push(a);
   }

   int pop(){
      int size = que1.size() - 1;//这里记得先减一
      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(){
      int size = que1.size() - 1;//这里记得先减一
      while (size--){
        que2.push(que1.front());
        que1.pop();
      }
      int result = que1.front();
      que2.push(que1.front());
      que1.pop();
      que1 = que2;
      while(!que2.empty()){
        que2.pop();
      } 
      return result;
   }

   bool empty(){
      return que1.empty();
   }
  

};

20. 有效的括号:栈由于其先入后出的特性,很适合相邻匹配的问题,代码如下:

#include <string>
#include <stack>
#include <iostream>

using namespace std;

bool isvaild(string s){
    if(s.size() % 2 != 0) return false;
    stack<char> stk;
    for(char ch : s){
        if (ch == '{') stk.push('}');
        if (ch == '[') stk.push(']');
        if (ch == '(') stk.push(')');
        if (ch == ')' || ch == '}' || ch == ']'){
            if(stk.empty()) return false;
            if(ch == stk.top()) stk.pop();
            else return false;
        }
    }
    if (stk.empty()) return true;
    else return false;
}

int main(){
    string s = "(]";
    cout << (isvaild(s) ? "vaild" : "not vaild") << endl;
    return 0;
}

1047. 删除字符串中的所有相邻重复项 

#include <iostream>
#include <string>
#include <stack>
#include <algorithm>

using  namespace std;

//为了用栈而用,其实直接用字符串空间复杂度O(1)
string removeDuplicates (string s){
    stack<char> st;
    for(char ch : s){
        if(st.empty() || ch != st.top()){
            st.push(ch);
        }else{
            st.pop();
        }
    }
    string result = "";
    while(!st.empty()){
        result.push_back(st.top());
        st.pop();
    }
    reverse(result.begin(),result.end());
    return result;

}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值