zoukankan      html  css  js  c++  java
  • 栈&队列

    1、用两个栈实现队列

    add:压入栈后pushToPop

    poll:pushToPop后弹出栈

    peek:pushToPop后得到队首元素

     1 public class TwoStacksQueue {
     2         public Stack<Integer> stackPush;
     3         public Stack<Integer> stackPop;
     4 
     5         public TwoStacksQueue() {
     6             stackPush = new Stack<Integer>();
     7             stackPop = new Stack<Integer>();
     8         }
     9 
    10         private void pushToPop() {
    11             if (stackPop.empty()) {
    12                 while (!stackPush.empty()) {
    13                     stackPop.push(stackPush.pop());
    14                 }
    15             }
    16         }
    17 
    18         public void add(int pushInt) {
    19             stackPush.push(pushInt);
    20             pushToPop();
    21         }
    22 
    23         public int poll() {
    24             if (stackPop.empty() && stackPush.empty()) {
    25                 throw new RuntimeException("Queue is empty!");
    26             }
    27             pushToPop();
    28             return stackPop.pop();
    29         }
    30 
    31         public int peek() {
    32             if (stackPop.empty() && stackPush.empty()) {
    33                 throw new RuntimeException("Queue is empty!");
    34             }
    35             pushToPop();
    36             return stackPop.peek();
    37         }
    38 }

    2、用一个队列实现栈

    push:入队列后把前面的n个元素依次换到后面去

    pop:把队首元素弹出

     1 class StackByQueue {
     2         queue<int> q;
     3     public:
     4         /** Initialize your data structure here. */
     5         MyStack() {
     6 
     7         }
     8 
     9         /** Push element x onto stack. */
    10         void push(int x) {
    11             q.push(x);
    12             int cnt=q.size();
    13             while(--cnt) {
    14                 q.push(q.front());
    15                 q.pop();
    16             }
    17         }
    18 
    19         /** Removes the element on top of the stack and returns that element. */
    20         int pop() {
    21             int temp=q.front();
    22             q.pop();
    23             return temp;
    24         }
    25 
    26         /** Get the top element. */
    27         int top() {
    28             return q.front();
    29         }
    30 
    31         /** Returns whether the stack is empty. */
    32         bool empty() {
    33             return q.empty()? true : false;
    34         }
    35 };

    3、用两个队列实现栈

    push:入队queue

    pop:将队列的前面元素依次换到help队列里面去(只保留一个元素在queue队列),弹出queue队列唯一的元素res,交换队列指针并返回res

    peek:将队列的前面元素依次换到help队列里面去(只保留一个元素在queue队列),弹出queue队列唯一的元素res然后将其入help队列,交换队列指针并返回res

     1 public static class TwoQueuesStack {
     2         private Queue<Integer> queue;
     3         private Queue<Integer> help;
     4 
     5         public TwoQueuesStack() {
     6             queue = new LinkedList<Integer>();
     7             help = new LinkedList<Integer>();
     8         }
     9 
    10         public void push(int pushInt) {
    11             queue.add(pushInt);
    12         }
    13 
    14         public int peek() {
    15             if (queue.isEmpty()) {
    16                 throw new RuntimeException("Stack is empty!");
    17             }
    18             while (queue.size() != 1) {
    19                 help.add(queue.poll());
    20             }
    21             int res = queue.poll();
    22             help.add(res);
    23             swap();
    24             return res;
    25         }
    26 
    27         public int pop() {
    28             if (queue.isEmpty()) {
    29                 throw new RuntimeException("Stack is empty!");
    30             }
    31             while (queue.size() > 1) {
    32                 help.add(queue.poll());
    33             }
    34             int res = queue.poll();
    35             swap();
    36             return res;
    37         }
    38 
    39         private void swap() {
    40             Queue<Integer> tmp = help;
    41             help = queue;
    42             queue = tmp;
    43         }
    44 
    45 }

    4、设计一个有 getMin 功能的栈

    法一:

    两个栈:data和min,待压入的数据:newnum

    push:对于data,压入;对于min,当newnum<=min.top()或min栈空,压入

    pop:对于data,弹出栈顶元素value;对于min,当value=min.top(),弹出,当value>min.top(),不弹出。返回value

    getMin:返回min.top()

     1 public static class MyStack1 {
     2         private Stack<Integer> stackData;
     3         private Stack<Integer> stackMin;
     4 
     5         public MyStack1() {
     6             this.stackData = new Stack<Integer>();
     7             this.stackMin = new Stack<Integer>();
     8         }
     9 
    10         public void push(int newNum) {
    11             if (this.stackMin.isEmpty()) {
    12                 this.stackMin.push(newNum);
    13             } else if (newNum <= this.getmin()) {
    14                 this.stackMin.push(newNum);
    15             }
    16             this.stackData.push(newNum);
    17         }
    18 
    19         public int pop() {
    20             if (this.stackData.isEmpty()) {
    21                 throw new RuntimeException("Your stack is empty.");
    22             }
    23             int value = this.stackData.pop();
    24             if (value == this.getmin()) {
    25                 this.stackMin.pop();
    26             }
    27             return value;
    28         }
    29 
    30         public int getmin() {
    31             if (this.stackMin.isEmpty()) {
    32                 throw new RuntimeException("Your stack is empty.");
    33             }
    34             return this.stackMin.peek();
    35         }
    36 }

    法二:

    两个栈:data和min,待压入的数据:newnum

    push:对于data,压入;对于min,当newnum<min.top()或栈空,压入newnum,当newnum>=min.top(),压入min.top()

    pop:对于min,弹出;对于data,弹出并返回

    getMin:返回min.top()

     1 public static class MyStack2 {
     2         private Stack<Integer> stackData;
     3         private Stack<Integer> stackMin;
     4 
     5         public MyStack2() {
     6             this.stackData = new Stack<Integer>();
     7             this.stackMin = new Stack<Integer>();
     8         }
     9 
    10         public void push(int newNum) {
    11             if (this.stackMin.isEmpty()) {
    12                 this.stackMin.push(newNum);
    13             } else if (newNum < this.getmin()) {
    14                 this.stackMin.push(newNum);
    15             } else {
    16                 int newMin = this.stackMin.peek();
    17                 this.stackMin.push(newMin);
    18             }
    19             this.stackData.push(newNum);
    20         }
    21 
    22         public int pop() {
    23             if (this.stackData.isEmpty()) {
    24                 throw new RuntimeException("Your stack is empty.");
    25             }
    26             this.stackMin.pop();
    27             return this.stackData.pop();
    28         }
    29 
    30         public int getmin() {
    31             if (this.stackMin.isEmpty()) {
    32                 throw new RuntimeException("Your stack is empty.");
    33             }
    34             return this.stackMin.peek();
    35         }
    36 }
    View Code

    法三:

     1 class MinStack {
     2         stack<int> x_stack;
     3         stack<int> min_stack;
     4     public:
     5         MinStack() {
     6             min_stack.push(INT_MAX);
     7         }
     8 
     9         void push(int x) {
    10             int min = min_stack.top()<x? min_stack.top() : x;
    11             x_stack.push(x);
    12             min_stack.push(min);
    13         }
    14 
    15         void pop() {
    16             x_stack.pop();
    17             min_stack.pop();
    18         }
    19 
    20         int top() {
    21             return x_stack.top();
    22         }
    23 
    24         int min() {
    25             return min_stack.top();
    26         }
    27 };
    View Code

    5、验证栈的压入、弹出序列

    压入一个,弹出若干

     1 public boolean validateStackSequences(int[] pushed, int[] popped) {
     2     Stack<Integer> stack = new Stack<>();
     3     int i = 0;
     4     for(int num : pushed) {
     5         stack.push(num); // num 入栈
     6         while(!stack.isEmpty() && stack.peek() == popped[i]) { // 循环判断与出栈
     7             stack.pop();
     8             i++;
     9         }
    10     }
    11     return stack.isEmpty();
    12 }

    6、用一个栈实现另一个栈的排序

    想模型:设置一个主栈stack,一个辅助站help,将元素从:stack->help->stack

     1 public static void sortStackByStack(Stack<Integer> stack) {
     2     Stack<Integer> help = new Stack<Integer>();
     3     while (!stack.isEmpty()) {
     4         int cur = stack.pop();
     5         while (!help.isEmpty() && help.peek() < cur) {
     6             stack.push(help.pop());
     7         }
     8         help.push(cur);
     9     }
    10     while (!help.isEmpty()) {
    11         stack.push(help.pop());
    12     }
    13 }

    7、仅用递归函数和栈操作逆序一个栈

     1 public static int getAndRemoveLastElement(Stack<Integer> stack) {
     2     int result = stack.pop();
     3     if (stack.isEmpty()) {
     4         return result;
     5     } else {
     6         int last = getAndRemoveLastElement(stack);
     7         stack.push(result);
     8         return last;
     9     }
    10 }
    11 public static void reverse(Stack<Integer> stack) {
    12     if (stack.isEmpty()) {
    13         return;
    14     }
    15     int i = getAndRemoveLastElement(stack);
    16     reverse(stack);
    17     stack.push(i);
    18 }

    8、逆波兰表达式求值(后缀表达式->中缀表达式->求值)

     1 public int evalRPN(String[] tokens) {
     2     Stack<Integer> stack = new Stack<>();
     3     int a = 0, b = 0;
     4     for (String val:tokens) {
     5         if ("+-*/".contains(val)) {
     6             a = stack.pop();
     7             b = stack.pop();
     8         }
     9         switch(val) {
    10             case "+": stack.push(b + a);break;
    11             case "-": stack.push(b - a);break;
    12             case "*": stack.push(b * a);break;
    13             case "/": stack.push(b / a);break;
    14             default : stack.push(new Integer(val));
    15         } 
    16     }
    17     return stack.pop();
    18 }
  • 相关阅读:
    centos通过yum安装php
    CentOS6 用yum安装mysql详解,简单实用
    启用CentOS6.5 64位安装时自带的MySQL数据库服务器
    Python三方库:Pandas(数据分析)
    Python三方库:Numpy(数组处理)
    Java笔记:反射,注解
    Java笔记:多线程
    Java笔记:IO流
    Java笔记:集合
    Java笔记:数组,异常,泛型
  • 原文地址:https://www.cnblogs.com/i-chase/p/13443002.html
Copyright © 2011-2022 走看看