二、棧
1.棧的定義:
棧又叫LIFO(後進先出)表
:是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫作棧的頂(top)。
2.棧的基本操作:
push(進棧)
pop(出棧)
代碼實例
package demo.test;
public class MyStack {
//棧的底層使用數組存儲元素
int[] elements;
public MyStack() {
elements = new int[0];
}
//壓入元素
public void push(int element) {
int[] newArr = new int[elements.length+1];
//把原數組元素複製到新數組中
for(int i=0;i<elements.length;i++) {
newArr[i] = elements[i];
}
//把添加的元素放到新數組中
newArr[elements.length] = element;
//替換
elements = newArr;
}
//取出棧頂元素
public int pop() {
if (elements.length==0) {
throw new RuntimeException("stack is empty");
}
int element = elements[elements.length-1];
//創建新數組
int[] newArr = new int[elements.length-1];
//取出後放入新數組
for (int i=0;i<elements.length-1;i++) {
newArr[i] = elements[i];
}
//替換數組
elements = newArr;
//返回棧頂元素
return element;
}
//查看棧頂元素
public int peek() {
if (elements.length==0) {
throw new RuntimeException("stack is empty");
}
return elements[elements.length-1];
}
//判斷棧頂元素是否爲空
public boolean isEmpty() {
return elements.length == 0;
}
}
測試代碼:
package demo.test1;
import demo.test.MyStack;
public class TestMyStack {
public static void main(String[] args) {
//創建一個棧
MyStack ms = new MyStack();
//壓入數據
ms.push(9);
ms.push(8);
ms.push(7);
//取出棧頂元素
System.out.println(ms.pop());
System.out.println(ms.pop());
System.out.println(ms.pop());
//查看棧頂元素
//System.out.println(ms.peek());
System.out.println(ms.isEmpty());
}
}
3.棧的實現:
- 使用鏈式結構
- 使用數組
4.棧的應用
- 平衡符號: 用以檢測大型程序是否由於缺少符號而引起的錯誤
- 後綴表達式: 將
後綴
或逆波蘭
記法的表達式 如 6 5 2 3 + 8 * + 3 + *通過棧,沒必要知道任何優先規則。 - 中綴到後綴的轉換: 用棧將一個標準形式的表達式(或叫作中綴表達式)轉換成後綴表達式如將中綴表達式 a + b * c + ( d * e + f ) * g 可轉換爲 abc * + de * f +g * +
- 方法調用:
不用遞歸打印一個表
public static <AnyType> void printList(Iterator<AnyType> itr) {
while(true) {
if (!itr.hasNext())
return;
System.out.println(itr.next());
}
}