日期:2014-05-20 浏览次数:21169 次
import javax.swing.JButton;
public class C24 {
// 定义一个栈数组
int stackArr[];
// 定义栈的大小
int maxsize;
// 定义栈顶
int top;
// 初始化一个大小为size的栈
char ch[]={'+','-','*','/','(',')','#'};//把符号转换成一个字符数组
int f1[]={3,3,5,5,1,6,0};//栈内元素优先级
int f2[]={2,2,4,4,6,1,0};//栈外的元素优先级
int n=0;
public C24()
{
maxsize = 100;
stackArr = new int[maxsize];
top =0;
}
public void push(int value) {
stackArr[++top] = value;
}
// 出栈操作
public int pop() {
return stackArr[top--];
}
// 取栈顶元素
public int peek() {
return stackArr[top];
}
// 判断栈是否为空
public boolean isEmpty() {
return top == 0;
}
// 判断栈是否已满
public boolean isFull() {
return top == maxsize - 1;
}
public int cton(char c)
{
switch(c)
{
case '+':
return 0;
case '-':
return 1;
case '*':
return 2;
case '/':
return 3;
case '(':
return 4;
case ')':
return 5;
default:
return 6;
}
}
public char Compare(char c1,char c2)
{
int i1=cton(c1);
int i2=cton(c2);//把字符变成数字
if(f1[i1]>f2[i2])//通过原来设定找到优先级
return '>';
else if(f1[i1]<f2[i2])
return '<';
else
return '=';
}
public int Operate(int a,int t,int b)
{
int sum;
switch(t)
{
case 0:
sum=a+b;
break;
case 1:
sum=a-b;
break;
case 2:
sum=a*b;
break;
default:
sum=a/b;
}
return sum;
}
public int EvaluateExpression(String s)
{
char c;
int count=0;
int i=0,sum=0;
int k=1,j=1;//设置了开关变量
int x,t,a ,b ;
C24 OPTR=new C24();
C24 OPND=new C24();
OPTR.push(cton('#'));//0压入栈
c=s.charAt(count++);
while(c!='#'||ch[OPTR.peek()]!='#')
{
if(Character.isDigit(c)) //判断c是否为数字
{
sum=0;
while(Character.isDigit(c))
{
if(j==0) //是否进行数字串的转换判断,为0转换
{
sum=sum*10-(c-'0');//字符c转换成了对应的数字
}
else sum=sum*10+(c-'0');
c=s.charAt(count++);
}
OPND.push(sum);//当前c不为数字,则把之前的把数字串转化成十进制数字再压栈
j=1; //将数字串转化后压入栈后将其置1
}
else if(k!=0)
{
switch(Compare(ch[OPTR.peek()],c))
{
case'<': OPTR.push(cton(c));//把它们整型化
c=s.charAt(count++);
break;
case'=': x=OPTR.pop();
c=s.charAt(count++);
break;
case'>': t=OPTR.pop();
b= OPND.peek();
a= OPND.peek();//注意这里是谁先出栈
OPND.push(Operate(a,t,b));
break;
}
}
}
return(OPND.peek());
}
public static void main(String args[])
{
System.out.print(new C24().EvaluateExpression("1+22*6*7-9#"));
}
}