1. 程式人生 > >設計一個帶有getMin功能的棧

設計一個帶有getMin功能的棧

題目:

        實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。


要求:

        1,pop, push, getMin操作的時間複雜度都是O(1).


注:

        1, 設計的棧型別可以使用現有的棧結構。


思路:

       

可以考慮使用兩個棧來進行設計,一個棧用來儲存當前棧中的元素,其功能和一個正常的棧沒有區別,這個棧記為stackData;另一個棧用於儲存每一步的最小值,這個棧記為stackMin。


程式碼:

思路一:

public class MyStack1 {
	private Stack<Integer> stackData; // 同正常棧功能
	private Stack<Integer> stackMin; //用於儲存每一步的最小值

	public MyStack1() {
		this.stackData = new Stack<Integer>();
		this.stackMin = new Stack<Integer>();
	}

	public void push(int newNum) {
		if (this.stackMin.isEmpty()) {
			this.stackMin.push(newNum);
		} else if (newNum <= this.getmin()) {
			this.stackMin.push(newNum);
		}
		this.stackData.push(newNum);
	}

	public int pop() {
		if (this.stackData.isEmpty()) {
			throw new RuntimeException("Your stack is empty.");
		}
		int value = this.stackData.pop();
		if (value == this.getmin()) {
			this.stackMin.pop();
		}
		return value;
	}

	public int getmin() {
		if (this.stackMin.isEmpty()) {
			throw new RuntimeException("Your stack is empty.");
		}
		return this.stackMin.peek();
	}
}


思路二:

public class MyStack2 {
	private Stack<Integer> stackData;
	private Stack<Integer> stackMin;

	public MyStack2() {
		this.stackData = new Stack<Integer>();
		this.stackMin = new Stack<Integer>();
	}

	public void push(int newNum) {
		if (this.stackMin.isEmpty()) {
			this.stackMin.push(newNum);
		} else if (newNum < this.getmin()) {
			this.stackMin.push(newNum);
		} else {
			int newMin = this.stackMin.peek();
			this.stackMin.push(newMin);
		}
		this.stackData.push(newNum);
	}

	public int pop() {
		if (this.stackData.isEmpty()) {
			throw new RuntimeException("Your stack is empty.");
		}
		this.stackMin.pop();
		return this.stackData.pop();
	}

	public int getmin() {
		if (this.stackMin.isEmpty()) {
			throw new RuntimeException("Your stack is empty.");
		}
		return this.stackMin.peek();
	}
}
我們一起努力吧,QQ群(478705720)海量的書籍,視訊,原始碼資料,豐富的求職內推資訊,分享給正在努力奮鬥的你!成功路上,我們風雨同行!