中缀表达式转后缀表达式并计算结果(C语言版)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中缀表达式转后缀表达式

中缀表达式转后缀表达式的规则。

1.遇到操作数:直接输入到后缀表达式栈

2.遇到运算符,直接入操作符栈

3.遇到左括号:直接将其入栈

4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。

5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈

6.最终将操作符栈中的元素依次出栈,输出到后缀表达式栈。

以下是自己写的代码。亲测没有问题。(模拟一个计算器,可以带括号,中间可以空格,只支持整数输入,但是输出结果精确到小数后6位)

#include "stdio.h"

#define MAX_LEN 100

typedef struct cal{

unsigned char isOper;//是否是操作数1,操作符0.操作数

double Num; //值。或者是操作符的ASCII值

}STRUCT_CAL;

#define IS_NUM 0x00

#define IS_OPER 0x01

STRUCT_CAL stackCal[MAX_LEN];

STRUCT_CAL stackCalBack[MAX_LEN];

unsigned char topCal;

char stackOper[MAX_LEN];

unsigned char topOper;

/*****************************************************************

* 堆栈初始化

*****************************************************************/

void stackInit(void)

{

int i;

for(i=0;i

{

stackCal[i].isOper = 0;

stackCal[i].Num = 0;

stackOper[i] = 0;

}

topCal = topOper = 0;

}

/***************************************************************** * 返回堆栈的栈顶,返回后栈顶减一

*****************************************************************/ STRUCT_CAL * stackCalPop(void)

{

if(topCal == 0)return (STRUCT_CAL *)0;

return stackCal+(--topCal);

}

/***************************************************************** * 计算表达式入栈

*****************************************************************/

void stackCalPush(double num, unsigned char isOper)

{

if(topCal>=MAX_LEN)return;

stackCal[topCal].Num = num;

stackCal[topCal].isOper= isOper;

topCal++;

}

/***************************************************************** * 操作符出栈

*****************************************************************/

char stackOperPop(void)

{

if(topOper == 0)return 0;

return stackOper[--topOper];

}

/*****************************************************************

* 操作符入栈

*****************************************************************/

void stackOperPush(char oper)

{

if(topOper >=MAX_LEN)return;

stackOper[topOper++] = oper;

}

/*****************************************************************

* 比较两个sour sour1 的优先级

* 1 sour >= sour1 直接入操作符栈

* 0 sour < sour1 直接入计算表达式栈

*****************************************************************/ unsigned char comparPrior(char sour, char sour1)

{

if(sour =='\0' ||sour1 == '\0') return 1;

switch(sour)

{

case '+':

case '-':

if(sour1 == '*' ||sour1 == '/'||sour1 == '+' ||sour1 == '-' )

{

return 0;

}

else

{

return 1;

}

break;

case '*':

case '/':

if(sour1 == '*' ||sour1 == '/'||sour1 == '+' ||sour1 == '-'||sour1 == '(')

{

return 1;

}

else

{

return 0;

}

break;

default:

return 1;

相关文档
最新文档