中缀表达式转逆波兰式并求值

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档