利用栈中缀表达式求值
头文件
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}Sqstack;
Status Initstack(Sqstack &S)
{
S.base=new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=MAXSIZE;
return OK;
}
Status emptystack(Sqstack S)
{
if(S.top==S.base)
return 1;
else return 0;
}
Status push(Sqstack &S,SElemType e)
{
if(S.top-S.base==S.stacksize) return ERROR;
*S.top++=e;
return OK;
}
Status Pop(Sqstack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
Status GetTop(Sqstack S)//),SElemType &e)
{
if(S.top!=S.base)
return *(S.top-1);
}
const char oper[7] = { '+', '-', '*', '/', '(', ')', '#' };
bool In(char ch) {//判断ch是否为运算符
int i;
for ( i = 0; i < 7; i++) {
if (ch == oper[i]) {
return true;
}
}
return false;
}
char Precede(char theta1, char theta2) {//判断运算符优先级
if ((theta1 == '(' && theta2 == ')') || (theta1 == '#' && theta2 == '#')) {
return '=';
} else if (theta1 == '(' || theta1 == '#' || theta2 == '(' || (theta1
== '+' || theta1 == '-') && (theta2 == '*' || theta2 == '/')) {
return '<';
} else
return '>';
}
char Operate(char first, char theta, char second) {//计算两数运算结果
switch (theta) {
case '+':
return (first - '0') + (second - '0') + 48;
case '-':
return (first - '0') - (second - '0') + 48;
case '*':
return (first - '0') * (second - '0') + 48;
case '/':
return (first - '0') / (second - '0') + 48;
}
return 0;
}
主函数
#include<stdio.h>
typedef int Status;
typedef char SElemType;
#include"Sqstack.h"
char EvaluateExpression()
{
Sqstack OPND;
Sqstack OPTR;
Initstack(OPND);
Initstack(OPTR);
char ch,theta,a,b,x;
push(OPTR, '#');
printf("请输入要求的表达式");
ch=getchar();
while (ch!='#'||GetTop(OPTR)!='#')
{
if (!In(ch)) { push(OPND,ch); ch=getchar(); }
else
switch (Precede(GetTop(OPTR),ch))
{
case '<':
push(OPTR, ch); ch=getchar();
break;
case '>':
Pop(OPTR,theta);
Pop(OPND, b); Pop(OPND,a);
push(OPND,Operate(a,theta,b));
break;
case '=':
Pop(OPTR, x); ch=getchar();
break;
}
}
return GetTop(OPND);
}
int main(){
char a;
a=EvaluateExpression();
printf("%c",a);
return 0;
}
注:此程序只能计算0~ 9的数因为在ASCII表中只能转换0~ 9的数为此程序的弊端;
中缀表达式到后缀表达式的转换
例:(6/3+5)6
1.遇到操作数,直接输出;
2.栈为空时,遇到运算符,入栈;
3.遇到左括号,将其入栈;
4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
5.遇到其他运算符’+”-””/’时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;
6.最终将栈中的元素依次出栈,输出。
首先从左向右扫描遇到左括号它比#的优先级高将它入栈
然后遇到操作数6输出 6
遇到/号遇到左括号入栈 6
遇到操作数输出3 63
遇到+号由于/号优先级大于+号所以弹出/号并将+号压入栈 63/
遇到操作数5输出 63/5
遇到右括号与左括号抵消掉并将+号弹出 63/5+
遇到乘号比#的优先级高入栈 63/5+
与操作数6输出 63/5+6
最后将乘号弹出 63/5+6*