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

更新时间:2023-10-23 04:17:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

中缀表达式转后缀表达式

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

1.遇到操作数:直接输入到后缀表达式栈 2.遇到运算符,直接入操作符栈 3.遇到左括号:直接将其入栈

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

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

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

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

#include \

#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

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

*****************************************************************/ 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;

break; } }

/***************************************************************** * 将输入的字符串转换为栈

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

void StrToCal(char *pStr) { int tmpNum = 0; char tmpOper;

char islastNum = 0;//判断上一个字符是什么。如果是符号,现在碰到‘-’,那么数字就是负数 char isNumNegative = 0; while(*pStr != '\\0') { switch(*pStr) { case '+': while(comparPrior('+',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; } stackOperPush('+'); pStr++; islastNum = 0; break; case '-':

if(islastNum == 0) //如果上一个字符是 操作符,那么接下来的数字是负数 { isNumNegative = 1;// 1代表 是负数 pStr++; break; }

while(comparPrior('-',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; }

stackOperPush('-'); pStr++;

islastNum = 0; break; case '*': while(comparPrior('*',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; }

stackOperPush('*'); pStr++;

islastNum = 0; break; case '/': while(comparPrior('/',stackOper[topOper-1]) == 0) { stackCalPush(stackOperPop(), IS_OPER); if(topOper<1)break; }

stackOperPush('/'); pStr++;

islastNum = 0; break; case '(': stackOperPush('('); pStr++;

islastNum = 0; break; case ')': while((tmpOper = stackOperPop()) != '(') { stackCalPush(tmpOper, IS_OPER); } pStr++;

本文来源:https://www.bwwdw.com/article/g53f.html

Top