栈和队列中比较简单的算法题

1. 求栈中的最小值

1.1 题目介绍

请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

1.2 解题思路

利用两个栈,一个存储完整数据DataStack,一个只存储当前最小值MinStack。
元素入栈时,和MinStack中的栈顶元素比较,如果小或者等于则将该元素分别压入DataStack和MinStack;
若大则只将元素压入DataStack中,直至元素入栈完毕,最小值为MinStack的栈顶元素。

代码实现

//本题中可以直接引用现成的栈结构和方法
class MinStack {
    private Stack<Integer> DataStack;
    private Stack<Integer> MinStack;

    public MinStack() {
        this.DataStack = new Stack<Integer>();
        this.MinStack = new Stack<Integer>();
    }
	//入栈
    public void push(int newNum){
        if(this.MinStack.isempty()){
            this.MinStack.push(newNum);
        }else if(newNum < MinStack.getMin()){
            this.MinStack.push(newNum);
        }
        this.DataStack.push(newNum);

    }
	//出栈
    public int pop(){
        if(this.DataStack.isempty()){
            throw new runtimeException("the stack is empty");
        }
        int Num = this.DataStack.pop();
        if(Num == this.getMin()){
            this.MinStack.pop();
        }
        return Num;
    }
	//获得最小值
    public int getMin(){
        if(this.MinStack.isempty()){
            throw new runtimeException("the stack is empty");
        }
        return this.MinStack.peek();
    }

}

1.3 复杂度

时间复杂度:O(1)
空间复杂度:O(n)

2.用两个栈来模拟一个队列

2.1 题目介绍

编写一个类,用两个栈实现队列,支持队列的基本操作(add, poll, peek)

2.2 解题思路

  • 两个栈,一个做入队栈,另外一个做出队栈
  • 入队栈为空时,才能在出队栈中做出队操作
  • 出队栈不为空,不能向入队栈中压入元素

代码实现

public class TwoStacks_Queue{
	private Stack<Integer> pushStack;
	private Stack<Integer> popStack;
	
	public TwoStacks_Queue(){
		pushStack = new Stack<Integer>();
		popStack = new Stack<Integer>();
	}
	
	//add 入队操作
	public void add(int NewNum){
		if(popStack.isEmpty()){
            //若入队列栈非空,将该栈元素迁移到出队栈
            while(!pushStack.isEmpty()){
                popStack.push(pushStack.pop);
            }
            pushStack.push(NewNum);
        }
	}
	
	//poll 出队操作
	public int poll(){
		if(pushStack.isEmpty() & popStack.isEmpty()){
			throw new RuntimeException("队列为空");
		//入队列栈非空,出队列栈为空时,将入队列栈元素全部移动到出队列栈
		}else if(popStack.isEmpty()){
			while(!pushStack.isEmpty()){
				popStack.push(pushStack.pop());
			}
		}
		return popStack.pop();
	}
	
	//peek 查看队首元素 和poll函数类似
	public int peek(){
		if(pushStack.isEmpty() & popStack.isEmpty()){
			throw new RuntimeException("队列为空");
		//入队列栈非空,出队列栈为空时,将入队列栈元素全部移动到出队列栈
		}else if(popStack.isEmpty()){
			while(!pushStack.isEmpty()){
				popStack.push(pushStack.pop());
			}
		}
		return popStack.pop();
	}
}

2.3 复杂度

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
原文地址:https://www.cnblogs.com/EthanWong/p/13449477.html