中缀表达式转逆波兰式并求值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中缀表达式转逆波兰式并求值
// 标题: 栈的应用——中缀表达式转逆波兰式 // 时间: 2015年4月14日// 所有者: Vae
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<windows.h>
#include<Winuser.h>
#define STACK_INIT_SIZE 100 #define STACKCREATE 10 #define OK 1 #define ERROR 0
typedef struct double_stack {
int *num;
int *index;
}DOUBLESTACK;
typedef struct SqStack
{
DOUBLESTACK top; DOUBLESTACK base;
int stacksize;
}SqStack;
// 函数名: InitStack // 形参类型: SqStack * // 函数功能构造一个栈void InitStack(SqStack *S) {
S->base.index = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
S->base.num = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if (!(S->base.num && S->base.index))
{
printf("构造栈失败!\n");
exit(-1);
}
S->top.num = S->base.num;
S->top.index = S->base.index;
S->stacksize = STACK_INIT_SIZE;
return ;
}
// 函数名: Push
// 形参类型: SqStack *, int, int // 函数功能插入e为新的栈顶元素int Push(SqStack *S, int m, int n)
{
if ((S->top.num - S->base.num) >= S->stacksize)
{
S->base.index = (int *)realloc(S-
>base.index,sizeof(int)*(STACK_INIT_SIZE+STACKCREATE));
S->base.num = (int *)realloc(S-
>base.num,sizeof(int)*(STACK_INIT_SIZE+STACKCREATE));
if (!(S->base.num || S->base.index))
return ERROR; }
*S->top.index++ = n;
*S->top.num++ = m;
S->stacksize = S->stacksize + STACKCREATE;
return OK;
}
// 函数名: Pop
// 形参类型: SqStack *, int *, int * // 函数功能出栈并用e返回int Pop(SqStack *S, int *a, int *b) {
if (S->base.num == S->top.num) return ERROR;
*a = * --S->top.num;
*b = * --S->top.index;
return OK;
}
// 函数名: GetTop
// 形参类型: SqStack *, int * // 函数功能用e返回栈顶元素
int GetTop(SqStack S, int *e) {
if (S.top.num == S.base.num)
return ERROR;
*e = *(S.top.num - 1);
return OK;
}
// 函数名: EmptyStack // 形参类型: SqStack
// 函数功能判断是否为空栈
int EmptyStack(SqStack S) {
if (S.base.num == S.top.num)
return OK;
else
return ERROR;
}
// 函数名: Precede
// 形参类型: char, char
// 函数功能判断运算符的优先关系
char Precede(char t1, char t2) { char f;
switch(t2)
{
case '+':
case '-':
if(t1=='(' || t1=='\n')
f = '<'; //t1<t2
else
f = '>'; // t1>t2
break;
case '*':
case '/':
if (t1=='*' || t1=='/' || t1==')') f = '>';
else
f = '<';
break;
case '(':
if (t1 == ')')
{
printf("括号不匹配\n");
exit(-1);
}
else
f = '<';
break;
case ')':
switch(t1)
{
case '(': f = '=';
break;
case '\n': printf("缺乏左括号\n"); exit(-1); default:
f = '>';
}
break;
case '\n':
switch(t1)
{
case '\n':
f = '='; break; case '(':
printf("缺乏右括号\n");
exit(-1);
default:
f = '>'; }
}
return f;
}
// 函数名: In
// 形参类型: char // 函数功能判断是否为7种运算符之一int In(char c)
{
switch(c)
{
case '+' :
case '-' :
case '*' :
case '/' :
case '(' :
case ')' :
case '\n': return OK;
default : return ERROR;
}
}
// 函数名: ShowStack // 形参类型: SqStack // 函数功能输出表达式的逆波兰式
void ShowStack(SqStack S) {
int a, b;
SqStack q;
InitStack(&q);
while (!EmptyStack(S))
{
Pop(&S,&a,&b);
Push(&q,a,b);
}
printf("原表达式转换成逆波兰式为\n"); while (!EmptyStack(q))
{
Pop(&q,&a,&b);
if (b == 0)
printf("%c ", a);
else
printf("%d ", a);
}
printf("\n");
}
// 函数名: Opertae // 形参类型: int, char, int // 函数功能做四则运算 a theta b
int Operator_(int a, char theta, int b)
{
switch(theta)
{
case '+':
return a+b; case '-':
return a-b;
case '*':
return a*b;
}
return a/b;
}
// 函数名: GetValue // 形参类型: SqStack
// 函数功能求的表达式的值
void GetValue(SqStack S) {
int a, b;
SqStack q,p;
int value;
int m, n;
int c, d;
char z;
InitStack(&q);
InitStack(&p);
while (!EmptyStack(S)) {
Pop(&S,&a,&b);
Push(&q,a,b); }
while (!EmptyStack(q)) {
Pop(&q,&a,&b);
if (b == 0)
{
Pop(&p,&m,&c);
Pop(&p,&n,&d);
z = toascii(a);
value = Operator_(n,z,m); Push(&p,value,1);
}
else
Push(&p,a,1);
}
Pop(&p,&a,&b);
printf("表达式的值为:%d\n", a);
return ;
}
// 函数名: EvaLuateExpression // 形参类型: void
// 函数功能得到逆置的后缀表达式
void EvaluateExpression()
{
SqStack OPRT, OPND; // 设OPTR 和 OPND 分别为运算符栈和运算数栈d, x; char
int y;
char c;
char z[11];
int i;
InitStack(&OPRT);
InitStack(&OPND);
Push(&OPRT,'\n',0); //将换行符压入运算符栈的栈底
c = getchar();
GetTop(OPRT,&x);//将运算符栈OPTR的栈顶元素赋值给x
while (c!='\n' || x!='\n')
{
if (In(c)) //c是7种运算符之一
{
switch(Precede(x,c)) //判断x和c的优先级 {
case '<':
Push(&OPRT,c,0);
c = getchar();
break; case '=':
Pop(&OPRT,&x,&y);
c=getchar();
break;
case '>':
Pop(&OPRT,&x,&y);
Push(&OPND,x,y);
}
}
else if (c>='0' && c<='9')
{
i = 0;
while (c>='0' && c<= '9') {
z[i++] = c;
c = getchar(); }
z[i] = '\0';
d = atoi(z); //将z中保存的数值型字符窜转化为整型存于d中 Push(&OPND,d,1);
}
else
{
printf("出现非法字符!\n");
exit(-1);
}
GetTop(OPRT,&x);
}
ShowStack(OPND);
GetValue(OPND);
}
int main(void)
{
printf("请输入表达式,负数用(0-正数)表示:"); EvaluateExpression();
return 0;
}。