public class Stack { private int maxSize=16; private int top; private int[] arr=null; public Stack(int maxSize) { if(maxSize<1){ throw new RuntimeException("长度太小"); } this.maxSize = maxSize; this.top = -1; this.arr = new int[maxSize]; } public boolean isFull(){ return top==maxSize-1; } public void push(int i){ if(isFull()){ throw new RuntimeException("栈已满"); } top++; arr[top]=i; } private boolean isEmpty(){ return top==-1; } public int pop(){ if(isEmpty()){ throw new RuntimeException("数据为空"); } int res=arr[top]; top--; return res; } public int peek(){ if(isEmpty()){ throw new RuntimeException("数据为空"); } return arr[top]; } public static void main(String[] args) { Stack stack = new Stack(5); stack.push(1); stack.push(2); stack.push(3); stack.push(4); stack.push(5); System.out.println(stack.peek()); System.out.println(stack.pop()); System.out.println(stack.pop()); } }
//通过栈实现简单的整数加减乘除的计算
public class Calculator { public static void main(String[] args) { //中缀表达式 7+2x5-8 String express = " 7000 + 2 x 5-8/2"; System.out.println(getNum(express)); } public static int getNum(String express){ char[] chars = express.trim().toCharArray(); Stack number = new Stack(10); Stack operate = new Stack(10); for (int i = 0; i < chars.length; i++) { char c=chars[i]; if(c==32){ //去除空字符 continue; } int num=0; if(isNumber(c)){ int j=getNumLimit(chars,i); num= getNum(chars,i,j); i=j-1; } if(isNumber(c)){ number.push(num); }else { if(operate.isEmpty()){ operate.push(c); }else { int peek = operate.peek(); if(priority((char) peek)>priority((char) c)){ int num1 = number.pop(); int num2 = number.pop(); int op = operate.pop(); int ret = compute(num1, num2, (char) op); number.push(ret); operate.push(c); }else { operate.push(c); } } } } while (true){ if(operate.isEmpty()){ break; } int num1 = number.pop(); int num2 = number.pop(); int op = operate.pop(); int ret = compute(num1, num2, (char) op); number.push(ret); } return number.pop(); } public static int getNum(char[] arr,int start,int end){ String str=""; for (int i = start; i < end; i++) { str+=arr[i]; } return Integer.parseInt(str); } public static int getNumLimit(char[] arr,int i){ int length=arr.length; String str=""; while (true){ if(i>=length){ break; } char c=arr[i]; if(!isNumber(c)){ break; } str+=c; i++; } return i; } public static boolean isNumber(char c){ return (c+"").matches("\d"); } public static int priority(char a){ int i=0; switch (a){ case 'x': case '/': i=2; break; case '+': case '-': i=1; break; default: return -1; } return i; } public static int compute(int num1,int num2,char c){ int res=0; switch (c){ case '+': res=num1+num2; break; case '-': res=num2-num1; break; case 'x': res=num1*num2; break; case '/': res=num2/num1; break; } return res; } }