C语言中缀转后缀四则运算--For初学者
2018-09-26 19:48
92 查看
中缀表达式
后缀表达式
戳这里
现在大家都知道了什么是中缀表达式,后缀表达式。好,进正题。本文主要是用C语言,来做简单的编程实现转化功能。
例如,输入 :(5+3)*2+(6+3)
转化后的结果:5 3 + 2 * 6 3 + +(后附有图)
额,本人能力有限,所以难免有bug,读者在运行代码的时候,括号的输入是英文的(可以自行加上中文),注意输入格式。
代码如下:
编译环境是(Code::Blocks)。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 100 typedef char ElemType; typedef struct node { ElemType date; struct node *next; } StackNode; void InitStack(StackNode **p) {//初始化一个栈 (*p)=NULL; } int StackEmpty(StackNode *p) {//如果栈是空的返回0;不空返回1 if(p==NULL) return 0; return 1; } void Push(StackNode **top, ElemType x) {//入栈函数 StackNode *p; p=(StackNode *)malloc(sizeof(StackNode)); p->date=x; p->next=*top; *top=p; } void Pop(StackNode **top, ElemType *x) {//出栈操作 StackNode *p; if(*top==NULL) printf("Stack is empty!\n"); else{ *x=(*top)->date; p=*top; *top=(*top)->next; free(p); } } void Top(StackNode **top, ElemType *x) {//查看栈顶元素 StackNode *p; if(*top==NULL) printf("Stack is empty!\n"); else *x=(*top)->date; } void change(ElemType *str)//中缀转后缀 { //x1代表栈顶的元素,x2代表字符串中,当前读到的 //x1高于x2的优先级,将x1输出,接着比较新的栈顶元素 // 运算符优先级关系表 // x2 + - * / ( ) # //x1 int link[7][7]={1, 1,-1,-1,-1,1,1,// + 1, 1,-1,-1,-1,1,1,// - 1, 1, 1, 1,-1,1,1,// * 1, 1, 1, 1,-1,1,1,// / -1,-1,-1,-1,-1,0,2,// ( 1, 1, 1, 1, 2,1,1,// ) -1,-1,-1,-1,-1,2,0 // # };//1--高,2--不存在,0--相等,-1--低 ElemType link2[7]={'+','-','*','/','(',')','#'};//一维数组搜索字符的位置 ElemType x; int i=0,j,k; StackNode *p; InitStack(&p); Push(&p,'#');//栈内存放#,用于比较(与头结点的建立原理相似) while(str[i]) { if(str[i]=='(')//左括号优先级最低,无需比较直接入栈 Push(&p,str[i]); else if(str[i]<='9'&&str[i]>='0') printf("%c ",str[i]); else if(str[i]==')')//遇到右括号出栈 { Top(&p,&x); while(x!='(') { printf("%c ",x); Pop(&p,&x); Top(&p,&x); } Pop(&p,&x); } else{//其他情况看优先级 Top(&p,&x); for(j=0;str[i]!=link2[j];j++); for(k=0;x!=link2[k];k++); while(link[k][j]==1) { printf("%c ",x); Pop(&p,&x); Top(&p,&x); for(j=0;str[i]!=link2[j];j++); for(k=0;x!=link2[k];k++); } if(link[k][j]==-1) Push(&p,str[i]); } i++; } while(StackEmpty(p)&&p->date!='#')//如果栈不是空的,依次输出 { Pop(&p,&x); printf("%c ",x); } } int main() { ElemType str[MAX]; gets(str); change(str); return 0; }
嗯。。运行结果
相关文章推荐
- 简易四则运算,利用中缀转后缀表达…
- 四则运算之中缀表达式转后缀表达式
- 数据结构之栈(中缀转后缀计算四则运算)
- 中缀/后缀表达式转换-使用四则混合运算表达式生成树
- 中缀/后缀表达式转换-使用四则混合运算表达式生成树
- C#数学表达式计算(中缀转换后缀)数据结构 括号 四则运算 幂运算 取模 三角函数
- 软件工程随堂作业--随机产生30到四则运算(c语言)
- C语言(12)--简单的10以内四则运算测试器
- 【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
- 栈的测试--四则运算表达式求值(C语言)
- 数据结构栈Stack之中缀表达式转后缀表达式运算应用
- 二叉树实现运算符优先级算法,支持表达式前缀,中缀,后缀,层次,广义表输出
- 递归思路解决的四则运算问题,C语言
- C语言实现四则混合运算
- 栈的应用----四则运算,后缀逆波兰表示法(RPN)
- 后缀表达式的计算--For初学者
- C语言课设:中缀表达式转后缀表达式并求值(续)
- C语言编译四则运算
- JavaScript中,for, while, if, switch用到的后缀递减(a--)运算