C语言中缀转后缀四则运算--For初学者

中缀表达式 (正常的表达式1+2)

点这里

后缀表达式(逆波兰式12+)

戳这里
现在大家都知道了什么是中缀表达式,后缀表达式。好,进正题。本文主要是用C语言,来做简单的编程实现转化功能。
例如,输入 :(5+3)*2+(6+3)
转化后的结果:5 3 + 2 * 6 3 + +(后附有图)

原理:创建一个栈,对于中缀表达式,①如果遇到左括号"(",直接入栈。②如果遇到数字直接打印到屏幕上。③如果遇到右括号")",将栈中的元素依次出栈直到遇见左括号"("。④其他情况就通过优先级比较,设置一个二维数组和一个一维数组,如下:

    //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]={'+','-','*','/','(',')','#'};//一维数组搜索字符的位置

额,本人能力有限,所以难免有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;
}

嗯。。运行结果
在这里插入图片描述

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值