Java简单实现计算器——用数组实现栈
参考尚硅谷 数据结构视频
package DataStructures.stack;
import java.util.Scanner;
class ArrayStack2
{
private int maxSize;//栈的容量
private int[] stack;
private int top=-1;
public ArrayStack2(int maxSize)//初始化栈的大小
{
this.maxSize=maxSize;
stack=new int[this.maxSize];
}
public boolean Full()//判断是否栈满
{
return top==maxSize-1;
}
public boolean Empty()
{
return top==-1;
}
//入栈
public void push(int value)
{
if(Full()) {
System.out.println("The stack is full!");
return;
}
top++;
stack[top]=value;
}
//出栈
public int pop()
{
if(Empty())
{
System.out.println("The stack is empty!");
return 0;
}
int temp=stack[top];
top--;
return temp;
}
//遍历栈
public void displayStack()
{
if(Empty())
System.out.println("The stack is empty!");
int temp=top;
for(int i=0;i<=temp;i++)
{
System.out.printf("stack[%d] %d\n",i,stack[i]);
System.out.println(" ");
}
}
//返回栈顶
public int peek()
{
return stack[top];
}
public int priority(char oper)
{
if(oper=='*'||oper=='/')//优先级比较高的操作符
{
return 1;
}
else if(oper=='+'||oper=='-')//优先级比较低的操作符
return 0;
else
return -1;
}
//判断是不是一个运算符
public boolean ioOrder(char val)
{
return val=='+'||val=='-'||val=='*'||val=='/';
}
//计算方法
public int cal(int num1,int num2,int oper)
{
int res=0;
switch(oper)
{
case'+':
res=num1+num2;
break;
case'-':
res=num2-num1;
break;
case'*':
res=num1*num2;
break;
case'/':
res=num2/num1;
break;
default:
break;
}
return res;
}
}
public class Calculator {
public static void main(String[] args) {
String exp="3+2*6-2";
//创建两个栈,数栈,一个符号栈
ArrayStack2 numStack=new ArrayStack2(10);
ArrayStack2 operStack=new ArrayStack2(10);
int index=0;//用于扫描
int num1=0;
int num2=0;
int oper=0;
int res=0;
char ch=' ';
while(true)
{
ch=exp.substring(index,index+1).charAt(0);
System.out.println(ch);
//判断ch是什么
if(operStack.ioOrder(ch))
{
if(!operStack.Empty())
{
//如果符号栈中有运算符 要比较
if(operStack.priority(ch)<=operStack.priority((char) operStack.peek()))
{
num1=numStack.pop();
num2=numStack.pop();
oper=operStack.pop();
res=numStack.cal(num1,num2,oper);
//运算结果加入数栈
numStack.push(res);
operStack.push(ch);
}
else
{
operStack.push(ch);
}
}
else
{
operStack.push(ch);
}
}
else
numStack.push(ch-48);
//判断是否扫描到最后
index++;
if(index>=exp.length())
{
break;
}
}
while (true)//符号栈为空,数栈中只有一个数值
{
if(operStack.Empty())
break;
num1=numStack.pop();
num2=numStack.pop();
oper=operStack.pop();
res=numStack.cal(num1,num2,oper);
numStack.push(res);
}
System.out.printf("表达式结果%s =%d ",exp,numStack.pop());
}
}