public class yufafenxi { public static void main(String[] args) {
Stack stack1 = new Stack(); // 运算符栈
Stack stack2 = new Stack(); // 运算数栈
stack1.push('#');
char[] c = "4-2+3*2#".toCharArray(); // 算数表达式
int i = 0,result=0;
while(i<c.length){
if (!yunsuanfu(c[i])) { // 是否是运算符
stack2.push(c[i]);

else {
if (f(stack1.peek()) - g(c[i]) < 0) {
stack1.push(c[i]);

else {
int a = 0, b = 0;
char op = stack1.peek();
stack1.pop();
a = stack2.peek();
stack2.pop();
b = stack2.peek();
stack2.pop();
if (op == '+') {
result = b + a;
stack2.push((char) result);
}
else if (op == '-') {
result = b - a;
stack2.push((char) result);
}
else if (op == '*') {
result = b * a;
stack2.push((char) result);
}
else{
result = b / a;
stack2.push((char) result);
}
}
}
i++;
}
System.out.println(result);
} public static int f(char c) { // 左优先函数
switch (c) {
case '+':
return 2;
case '-':
return 2;
case '*':
return 3;
case '/':
return 3;
case '#':
return 0;
default:
return -1;
} } public static int g(char c) { // 右优先函数
switch (c) {
case '+':
return 2;
case '-':
return 2;
case '*':
return 3;
case '/':
return 3;
case '#':
return 0;
default:
return -1;
}
} public static boolean yunsuanfu(char c) { // 是运算符
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '#') {
return true;
}
return false;
}
}class Stack {
int top = -1;
char[] elem = new char[30]; void push(char i) {
top++;
elem[top] = i;
}
void pop(){
top--;
}
char peek() {
return elem[top];
}
}
运行结果怎么是"2550”?请大家帮我分析一下哪里错了!谢谢啦!

解决方案 »

  1.   

    while(i <c.length)这有问题,可能到了最后一个字符
    stack1里面还有运算符没计算呢
      

  2.   

    以前用C++写过一个,看看吧,本来想跟你改改的,但是最近很忙,不好意思!
    #include <iostream.h>
    #include <stdlib.h>const int INITIAL_SIZE = 100;
    const int OVERFLOW = 1;
    const char OPERATORS[8] = {'+', '-', '*', '/', '(', ')', '%', '#'};
    const char NUMBERS[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};typedef struct Stack
    {
    char c;
    char* top;
    char* base;
    }*pStack;pStack initStack(pStack stack)
    {
    stack->base = new char[INITIAL_SIZE];
    if(stack == NULL)
    {
    cout << "OVERFLOW" << endl;
    exit(OVERFLOW);
    }
    stack->top = stack->base;
    return stack;
    }void push(pStack stack, char c)
    {
    stack->top++;
    *stack->top = c;
    }void pop(pStack stack, char* c)
    {
    *c = *stack->top;
    stack->top--;
    }int isOperator(char c)
    {
    int flag = 0;
    for(int i = 0; i < 8; i++)
    {
    if(OPERATORS[i] == c)
    {
    flag = 1;
    break;
    }
    }
    return flag;
    }int isNumeric(char c)
    {
    int flag = 0;
    for(int i = 0; i < 10; i++)
    {
    if(NUMBERS[i] == c)
    {
    flag = 1;
    break;
    }
    }
    return flag;
    }char getTop(pStack stack)
    {
    return *stack->top;
    }char precede(char top, char c)
    {
    while(!isOperator(c))
    {
    cout << "请输入正确运算符" << endl;
    cin >> c;
    }
    char flag; switch(top)
    {
    case '+':
    case '-':
    switch(c)
    {
    case '*':
    case '/':
    case '%':
    case '(': flag = '<'; break;
    default: flag = '>'; break;
    }
    break; case '*':
    case '/':
    case '%':
    switch(c)
    {
    case '(': flag = '<'; break;
    default: flag = '>'; break;
    }
    break; case '(':
    switch(c)
    {
    case ')': flag = '='; break;
    default: flag = '<'; break;
    }
    break; case ')': flag = '>'; break; case '#':
    switch(c)
    {
    case '#': flag = '='; break;
    default: flag = '<'; break;
    }
    break;
    } return flag;
    }char operate(char a, char theta, char b)
    {
    switch(theta)
    {
    case '+':
    a = a + b;
    break;
    case '-':
    a = a - b;
    break;
    case '*':
    a = a * b;
    break;
    case '/':
    a = a / b;
    break;
    case '%':
    a = a % b;
    break;
    }
    return a;
    }char evalueateExpression()
    {
    char c, x, theta, a, b;
    int flag = 0;
    pStack OPTR = new Stack;
    pStack OPND = new Stack;
    OPTR = initStack(OPTR);
    OPND = initStack(OPND);
    push(OPTR, '#');
    push(OPND, 0); cout << "允许操作码:" ;
    for(int i = 0; i < 8; i++)
    cout << OPERATORS[i] << ", ";
    cout << "\n允许操作数:" ;
    for(int j = 0; j < 10; j++)
    cout << NUMBERS[j] << ", ";
    cout << "\n请输入表达式(\'#\'结束输入):" ; cin >> c;
    while((c != '#') || (getTop(OPTR) != '#'))
    {
    if(isNumeric(c))
    {
    if(!flag)
    {
    c = c - '0';
    push(OPND, c);
    cin >> c;
    }
    else
    {
    pop(OPND, &x);
    c = x * 10 + c - '0';
    push(OPND, c);
    cin >> c;
    }
    flag = 1;
    }
    else if(isOperator(c))
    {
    flag = 0;
    switch(precede(getTop(OPTR), c))
    {
    case '<':
    push(OPTR, c);
    cin >> c;
    break;
    case '=':
    pop(OPTR, &x);
    cin >> c;
    break;
    case '>':
    pop(OPTR, &theta);
    pop(OPND, &b);
    pop(OPND, &a);
    push(OPND, operate(a, theta, b));
    break;
    }
    }
    else
    {
    cout << "您输入了错误的操作符,系统退出,请原谅!" << endl;
    exit(0);
    }

    }
    return getTop(OPND);
    }void main(int arg, char** avg)
    {
    cout << "链表实现:" << endl;
    cout << "result is: " << (int) evalueateExpression() << endl;
    }
      

  3.   


    #include <iostream.h>
    #include <stdlib.h>const int INITIAL_SIZE = 100;
    const int OVERFLOW = 1;
    const char OPERATORS[8] = {'+', '-', '*', '/', '(', ')', '%', '#'};
    const char NUMBERS[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};typedef struct Stack
    {
    char c;
    char* top;
    char* base;
    }*pStack;pStack initStack(pStack stack)
    {
    stack->base = new char[INITIAL_SIZE];
    if(stack == NULL)
    {
    cout << "OVERFLOW" << endl;
    exit(OVERFLOW);
    }
    stack->top = stack->base;
    return stack;
    }void push(pStack stack, char c)
    {
    stack->top++;
    *stack->top = c;
    }void pop(pStack stack, char* c)
    {
    *c = *stack->top;
    stack->top--;
    }int isOperator(char c)
    {
    int flag = 0;
    for(int i = 0; i < 8; i++)
    {
    if(OPERATORS[i] == c)
    {
    flag = 1;
    break;
    }
    }
    return flag;
    }int isNumeric(char c)
    {
    int flag = 0;
    for(int i = 0; i < 10; i++)
    {
    if(NUMBERS[i] == c)
    {
    flag = 1;
    break;
    }
    }
    return flag;
    }char getTop(pStack stack)
    {
    return *stack->top;
    }char precede(char top, char c)
    {
    while(!isOperator(c))
    {
    cout << "请输入正确运算符" << endl;
    cin >> c;
    }
    char flag; switch(top)
    {
    case '+':
    case '-':
    switch(c)
    {
    case '*':
    case '/':
    case '%':
    case '(': flag = '<'; break;
    default: flag = '>'; break;
    }
    break; case '*':
    case '/':
    case '%':
    switch(c)
    {
    case '(': flag = '<'; break;
    default: flag = '>'; break;
    }
    break; case '(':
    switch(c)
    {
    case ')': flag = '='; break;
    default: flag = '<'; break;
    }
    break; case ')': flag = '>'; break; case '#':
    switch(c)
    {
    case '#': flag = '='; break;
    default: flag = '<'; break;
    }
    break;
    } return flag;
    }char operate(char a, char theta, char b)
    {
    switch(theta)
    {
    case '+':
    a = a + b;
    break;
    case '-':
    a = a - b;
    break;
    case '*':
    a = a * b;
    break;
    case '/':
    a = a / b;
    break;
    case '%':
    a = a % b;
    break;
    }
    return a;
    }char evalueateExpression()
    {
    char c, x, theta, a, b;
    int flag = 0;
    pStack OPTR = new Stack;
    pStack OPND = new Stack;
    OPTR = initStack(OPTR);
    OPND = initStack(OPND);
    push(OPTR, '#');
    push(OPND, 0); cout << "允许操作码:" ;
    for(int i = 0; i < 8; i++)
    cout << OPERATORS[i] << ", ";
    cout << "\n允许操作数:" ;
    for(int j = 0; j < 10; j++)
    cout << NUMBERS[j] << ", ";
    cout << "\n请输入表达式(\'#\'结束输入):" ; cin >> c;
    while((c != '#') || (getTop(OPTR) != '#'))
    {
    if(isNumeric(c))
    {
    if(!flag)
    {
    c = c - '0';
    push(OPND, c);
    cin >> c;
    }
    else
    {
    pop(OPND, &x);
    c = x * 10 + c - '0';
    push(OPND, c);
    cin >> c;
    }
    flag = 1;
    }
    else if(isOperator(c))
    {
    flag = 0;
    switch(precede(getTop(OPTR), c))
    {
    case '<':
    push(OPTR, c);
    cin >> c;
    break;
    case '=':
    pop(OPTR, &x);
    cin >> c;
    break;
    case '>':
    pop(OPTR, &theta);
    pop(OPND, &b);
    pop(OPND, &a);
    push(OPND, operate(a, theta, b));
    break;
    }
    }
    else
    {
    cout << "您输入了错误的操作符,系统退出,请原谅!" << endl;
    exit(0);
    }

    }
    return getTop(OPND);
    }void main(int arg, char** avg)
    {
    cout << "链表实现:" << endl;
    cout << "result is: " << (int) evalueateExpression() << endl;
    }
      

  4.   

    楼主的代码,没有细看哦,但是有两个建议,一个就是你的Stack类,最好在pop的时候要有个判断栈是不是为空,这个你可以在Stack类里定义,或者你在外面调用的时候定义;还有一个就是你的类名最好不要用拼音(纯属个人意见啊)。