中缀表达式转逆波兰式并求值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中缀表达式转逆波兰式并求值
// 标题: 栈的应用——中缀表达式转逆波兰式 // 时间: 2015年4月14日// 所有者: Vae
#include
#include
#include
#include
#include
#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 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)