您的位置:首页 > 编程语言 > C语言/C++

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;
}

嗯。。运行结果

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: