中缀表达式转后缀表达式并计算结果(C语言版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;