本系列博客源自学习《尚硅谷数据结构与算法》的学习随笔。
思路分析:
代码实现:
package test.learn.algorithm.Stack;
//定义一个数组表示的栈
public class ArrayStack {
private int MaxSize;
private int [] stack;
private int top = -1;
//构造器
public ArrayStack(int MaxSize){
this.MaxSize = MaxSize;
stack = new int[MaxSize];
}
//栈满
public boolean isFull(){
return top == MaxSize - 1;
}
//栈空
public boolean isEmpty(){
return top == -1;
}
//入栈
public void push(int value){
if(isFull()){
System.out.println("栈满,无法入栈!");
return;
}
stack[++top] = value;
}
//出栈
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈空");
}
int value = stack[top--];
return value;
}
//遍历栈
public void showStack(){
if(isEmpty()){
System.out.println("栈空");
return;
}
for(int i = 0 ;i<=top;i++){
System.out.print(stack[i]+" ");
}
System.out.println();
System.out.println("------------------------");
}
//设置优先级
public int priority(int oper){
if(oper == '*'||oper == '/'){
return 1;
}else if(oper == '+'||oper == '-'){
return 0;
}else{
return -1;
}
}
//判断是不是一个运算符
public boolean isOper(char val){
if(val == '+'||val == '-'||val == '*'||val == '/'){
return true;
}
return false;
}
//计算方法
public int calculate(int num1,int num2,int oper){
int result = 0;
switch (oper){
case'+':
result = num1+num2;
break;
case'-':
result = num2-num1;
break;
case'/':
result =num2/num1;
break;
case'*':
result =num1*num2;
break;
default:
break;
}
return result;
}
//得到栈顶元素
public int getTop(){
return stack[top];
}
}
package test.learn.algorithm.Stack;
public class Calculate {
public static void main(String[] args) {
ArrayStack numberStack = new ArrayStack(10);
ArrayStack operStack = new ArrayStack(10);
String expression = "4000+2*6-4";
int index = 0;
String keepNum = "";//用于拼接多位数
while(true){
char ch = expression.substring(index,index+1).charAt(0);
//判断ch是什么
if(operStack.isOper(ch)){//判断ch是什么数符
// System.out.println(ch);
if(!operStack.isEmpty()){//如果符号栈不为空
if(operStack.priority(ch)<= operStack.priority(operStack.getTop())){//如果该运算符的优先级小于等于栈顶优先级
int oper = operStack.pop();
int num1 = numberStack.pop();
int num2 = numberStack.pop();
//System.out.println(num1+" "+oper+" "+num2);
int result = numberStack.calculate(num1,num2,oper);
//System.out.println(result);
numberStack.push(result);
operStack.push(ch);
}else{//若优先级大于,直接入栈
operStack.push(ch);
}
}else {//如果为空,直接入栈
operStack.push(ch);
}
}else {//数
keepNum +=ch;
if(index == expression.length()-1){
numberStack.push(Integer.parseInt(keepNum));
}
else{
while(!operStack.isOper(expression.substring(index+1,index+2).charAt(0))){//可能是多位数
keepNum+=expression.substring(index+1,index+2).charAt(0);
index++;
}
//System.out.println(Integer.parseInt(keepNum));
numberStack.push(Integer.parseInt(keepNum));
keepNum="";
}
}
index++;
if(index >= expression.length()){
break;
}
}
while(!operStack.isEmpty()){//如果符号栈不为空
int oper = operStack.pop();
int num1 = numberStack.pop();
int num2 = numberStack.pop();
int result = numberStack.calculate(num1,num2,oper);
numberStack.push(result);
}
int result = numberStack.pop();
System.out.printf("表达式 %s = %d",expression,result);
}
}
结果: