天天看點

程式員不能不懂棧

PS:

1.這篇以數組為方式寫的棧其實是為了給:文章位址作補充關于棧的詳細解釋可以參考這篇文章

2.下面有關于逆波蘭式求解數學表達式的代碼

import java.util.*;
public class arithmetic {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		stack Stack=new stack(4); //建立一個棧的對象
		Stack.pop();//在空的情況下出個棧試試
		for(int i=0;i<4;i++) {//壓棧
			Stack.push(sc.nextInt());
		}
		Stack.push(4);//在棧已經滿的情況下壓棧
		
		for(int i=0;i<4;i++) {//出棧
			Stack.pop();
		}
		System.out.println("This stack whether empty "+Stack.Empty());
	}
}
class stack{
	int size;  //棧大小
	int[] arrstack;//建構的棧數組
	int top=-1;//棧頂指針用來記錄目前棧裡面的位置
	public stack(int size) {   // 建立構造方法同時也是棧的大小輸入點
		this.size=size;
		this.arrstack=new int[this.size];
	}
	public boolean Empty() { //判斷棧大小是否為空
		return this.top==-1;
	}
	public boolean Full() { //判斷棧是否以滿
		return this.top==this.size-1;
	}
	public void push(int value) { //壓棧
		if(Full()) { //壓棧前先判斷是否棧裡面元素已滿
			System.out.println("sorry stack is full");
			return ;
		}
		top++;
		arrstack[top]=value; //把剛輸入的元素放到棧頂
	}
	public void pop() { //出棧
		if(Empty()) { //判斷棧是否為空
			System.out.println("sorry stack is empty");
			return ;
		}
		System.out.println(arrstack[top]);
		top--; //将指針下移
		
	}
	
}
           

逆波蘭式求解數學表達式

import java.util.*;
public class arithmetic {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		String equation=sc.next();
		stack Stack=new stack(equation.length());

		char[] arr=equation.toCharArray();//建立字元型數組因為一會要判斷+,-,*,/
		for(char i:arr) {
			int tmp=Integer.valueOf(i);//尋找數組元素的ASCLL主要是判斷是數組還是運算符
			if(tmp>=48&&tmp<=57) {//如果是數字就轉為整型存入棧裡
				String t=String.valueOf(i);
				int int_t=Integer.valueOf(t);
				Stack.push(int_t);
			}
			else {
				if(tmp==Integer.valueOf('-')) {
					
					int second=Stack.pop();//先出來的是減數
					int first=Stack.pop();//接着是被減數
					int result=first-second;
					Stack.push(result);//将結果入棧
				}
				if(tmp==Integer.valueOf('+')) {
					int second=Stack.pop();
					int first=Stack.pop();
					int result=first+second;
					Stack.push(result);
				}
				if(tmp==Integer.valueOf('*')) {
					int second=Stack.pop();
					int first=Stack.pop();
					int result=first*second;
					Stack.push(result);
				}
				if(tmp==Integer.valueOf('/')) {
					int second=Stack.pop();
					int first=Stack.pop();
					int result=first/second;
					Stack.push(result);
				}
				
			}
		}
		System.out.println(Integer.valueOf(Stack.pop()));
		
	}
}
class stack{
	int size;  //棧大小
	int[] arrstack;//建構的棧數組
	int top=-1;//棧頂指針用來記錄目前棧裡面的位置
	public stack(int size) {   // 建立構造方法同時也是棧的大小輸入點
		this.size=size;
		this.arrstack=new int[this.size];
	}
	public boolean Empty() { //判斷棧大小是否為空
		return this.top==-1;
	}
	public boolean Full() { //判斷棧是否以滿
		return this.top==this.size-1;
	}
	public void push(int value) { //壓棧
		if(Full()) { //壓棧前先判斷是否棧裡面元素已滿
			System.out.println("sorry stack is full");
			return ;
		}
		top++;
		arrstack[top]=value; //把剛輸入的元素放到棧頂
	}
	public int pop() { //出棧
		if(Empty()) { //判斷棧是否為空
			System.out.println("sorry stack is empty");
			return -1;
		}
		int ans=arrstack[top];
		//System.out.println(arrstack[top]);
		top--; //将指針下移
		return ans;
	}
	
}
           

繼續閱讀