day9 栈实现队列&队列实现栈以及栈的经典应用

1.栈实现队列

        利用两个栈实现队列,定义一个输入栈和输出栈,一个用来存输入的数,一个用来存输出的数,实现先入先出,在存入数据的时候,存进输入栈;当输出的时候利用输出的栈,改变顺序。

解题步骤:

  • 增加:直接push进输入栈中
  • pop:讲输入栈弹出并存进输出栈中,并返回输出栈顶元素
  • peek:讲输入栈弹出并存进输出栈中,弹回返回输出栈顶元素
  • dumpstackin:讲输入栈数据倒入输出站中

       

代码实现:

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;
    
    public MyQueue() {
        stackIn = new Stack<>(); // 负责进栈
        stackOut = new Stack<>(); // 负责出栈
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        dumpStackIn();
        return stackOut.pop();
    }
    
    public int peek() {
        dumpStackIn();
        return stackOut.peek();
    }
    
    public boolean empty() {
        return stackIn.isEmpty()&&stackOut.isEmpty();
    }

    public void dumpStackIn(){
        if(!stackOut.isEmpty()){
            return;
        }
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}

2.有效的括号

         利用栈来实现,当栈为空的时候,就将符号存入栈中,若符号和栈顶元素匹配成功,则将元素弹出栈中。

实现步骤:

  • 利用for循环来遍历字符串,并将字符取出
  • 定义一个栈,并讲字符和栈顶字符进行匹配,若匹配不成功则存入栈中
  • 若匹配成功则弹出栈顶元素
  • 最后若栈有剩余元素,即匹配未成功的元素,则返回false

代码实现:

 public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(deque.isEmpty()){
                deque.push(ch);
            }else if(ch==')'&&deque.peek()=='('){
                deque.pop();
            }else if(ch==']'&&deque.peek()=='['){
                deque.pop();
            }else if(ch=='}'&&deque.peek()=='{'){
                deque.pop();
            }else{
                deque.push(ch);
            }
        }
        if(!deque.isEmpty()){
            return false;
        }
        return true;
    }

3.用队列实现栈

        本题利用一个队列就可以实现,在存入数据时,正常讲数据存进队列中,在取出数据时,讲队首元素取出,并重新放入队列的尾部,取出元素至最后一个元素时,停止操作并返回最后一个元素。

实现步骤:

  • push:正常讲元素push
  • pop:弹出元素是核心步骤,首先算出队列的长度size。然后讲size--,让取出元素时到最后一个元素停止,返回队首元素。
  • top:返回队尾元素
  • empty:直接调用方法判断是否为空

代码如下:

    // Deque 接口继承了 Queue 接口
    // 所以 Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirst
    Deque<Integer> que1;

    public MyStack() {
        que1 = new ArrayDeque<>();
    }
    
    public void push(int x) {
        que1.addLast(x);
    }
    
    public int pop() {
        int size = que1.size();
        size--;
        while(size>0){
            que1.addLast(que1.pollFirst());
            size--;
        }
        int res = que1.pollFirst();
        return res;
    }
    
    public int top() {
        return que1.peekLast();
    }
    
    public boolean empty() {
        return que1.isEmpty();
    }

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

        本题利用栈来解决匹配问题很方便,我们遍历字符串的同时判断栈顶元素是否和遍历的元素是否相同,若相同则弹出栈顶元素,重复此操作直至遍历结束。

解题步骤:

  • 定义一个栈,用来存放待遍历的元素
  • 再存入元素的同时判断待遍历的元素和栈顶元素是否相同,若相同则取出,不同则存入
  • 遍历结束时,依次取出元素

代码如下:

//c++语言实现    
string removeDuplicates(string S) {
        string result;
        for(char s : S) {
            if(result.empty() || result.back() != s) {
                result.push_back(s);
            }
            else {
                result.pop_back();
            }
        }
        return result;
    }
//队列实现
public String removeDuplicates(String s) {
        Deque<Character> deque = new ArrayDeque();
        for(int i=0;i<s.length();i++){
            char ch = s.charAt(i);
            if(deque.isEmpty()){
                deque.addLast(ch);
            }else if(ch==deque.peekLast()){
                deque.pollLast();
            }else{
                deque.addLast(ch);
            }
        }
        String res = "";
        for(char c:deque){
            res+=c;
        }
        return res;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值