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”?请大家帮我分析一下哪里错了!谢谢啦!
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”?请大家帮我分析一下哪里错了!谢谢啦!
stack1里面还有运算符没计算呢
#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;
}
#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;
}