算法逻辑:
OperandType EvaluateExpression(){
//算术表达式求值的算符优先算法, 设OPTR和OPND分别为运算符栈和运算数栈
//OP为运算符集合
InitStack(OPTR); Push(OPTR, '#');
InitStack(OPND); c = getchar();
while(c != '#' || GetTop(OPTR) != '#'){
if(!In(c, OP)){Push((OPND, c)); c = getchar();}//不是运算符进栈
else
switch(Precede(GetTop(OPTR), c)){
case '<'://栈顶元素优先权低
Push(OPTR, c); c = getchar(); break;
case '='://脱括号并接收下一字符
Pop(OPTR, x); c = getchar();
case '>'://栈顶元素优先权高, 退栈并将结果运算入栈
Pop(OPTR, theta); Pop(OPND, b); Pop(OPND, a);
Push(OPND, Operate(a, theta, b)); break;
}
}
return GetTop(OPND);
}
算法实现:
1. c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXSIZE 100
const char* OPERATOR_SET = "+-*/()#";
typedef struct {
int data[MAXSIZE];
int top;
} OperandStack;
void initOperandStack(OperandStack *s) {
s->top = -1;
}
int pushOperand(OperandStack *s, int elem) {
if (s->top == MAXSIZE - 1) {
fprintf(stderr, "Stack Overflow\n");
return -1;
}
s->data[++s->top] = elem;
return 0;
}
int popOperand(OperandStack *s) {
if (s->top == -1) {
fprintf(stderr, "Stack Underflow\n");
return -1;
}
return s->data[s->top--];
}
typedef struct {
char data[MAXSIZE];
int top;
} OperatorStack;
void initOperatorStack(OperatorStack *s) {
s->top = -1;
}
int pushOperator(OperatorStack *s, char elem) {
if (s->top == MAXSIZE - 1) {
fprintf(stderr, "Stack Overflow\n");
return -1;
}
s->data[++s->top] = elem;
return 0;
}
int popOperator(OperatorStack *s) {
if (s->top == -1) {
fprintf(stderr, "Stack Underflow\n");
return -1;
}
return s->data[s->top--];
}
char peekOperator(OperatorStack *s) {
if (s->top == -1) {
fprintf(stderr, "Stack Underflow\n");
return -1; // Use an invalid character to indicate error
}
return s->data[s->top];
}
int isInOperatorSet(char c) {
return strchr(OPERATOR_SET, c) != NULL;
}
int precedence(char op1, char op2) {
static const char precedence_table[7][7] = {
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', ' '},
{'>', '>', '>', '&g