C语言中缀表达式转成后缀表达式,并计算它的值

在C语言中,将中缀表达式转成后缀表达式,并计算它的结果,具体的思路如下:
1、定义两个栈,numStack用于存放运算对象,最后存放运算结果的,fuStack用于存放运算符号的
2、从左到右遍历字符串
3、如果当前的字符是一个数字,那么先不要着急将其转成数字,然后压入到numStack中,因为考虑到多位数字的情况,所以需要从当前下标开始遍历,一直遍历到第一个运算符出现,那么这时候才可以将运算符前面的数字转成字符串。然后调用atoi,将字符串转成一个数字。这时候,将这个数字输出,同时将其压入到numStack中。
4、如果当前的字符是一个字符,那么这时候需要分几种情况进行讨论:

(1)如果栈为空或者当前符号是一个左括号,直接将当前符号压入到fuStack中
(2)否则,如果栈顶符号是一个左括号,那么直接将当前符号压入到fuStack中
(3)否则,如果当前符号是一个右括号,那么需要将从fuStack中跳出字符,并输出这
个字符,然后从numStack中跳出两个数字,进行相应的运算,将运算结果压numStack
中,重复(3)操作,直到fuStack的栈顶符号是一个左括号,那么这时候,将左括号从
fuStack中跳出,注意不需要输出
(4)否则,当前符号是一个普通运算符的时候,那么这时候,需要比较当前符号和栈 
  顶符号的优先级,如果当前的符号优先级大于栈顶符号的优先级,那么直接将当前符
号压入到fuStack中,否则,当前符号的优先级小于等于栈顶符号的优先级,那么需要将
栈顶符号跳出,并输出,然后从numStack中跳出两个数字,进行相应的运算,然后将
运算结果压入到numStack中,重复这个步骤,直到当前符号的优先级大于栈顶符号的优
先级才可以将当前符号压入到fuStack中

5、遍历完之后,操作还没有结束,还需要判断fuStack是否为空,如果不为空,那么就从fuStack中跳出栈顶元素,并将其输出,同时,将从numStack中跳出两个数字,进行相应的运算,将运算结果压入到numStack中,重复5的操作,直到fuStack为空。
6、这时候,上述操作都完成之后,这时候numStack的栈顶元素就是整个表达式的运算结果,将其输出即可。

题目的链接:
https://pintia.cn/problem-sets/434/problems/5893
对应的代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_SIZE 21
#define ERROR 0
#define OK 1
typedef struct Num{
   
   
    int msg[MAX_SIZE];
    int top;
}numStack;
void initStack(numStack *num){
   
   
    num->top = 0;
}

int push(numStack *num,int e){
   
   
    if(num->top == MAX_SIZE)
        return ERROR;
    num->msg[num->top++] = e;
    return OK;
}
int pop(numStack *num,int *e){
   
   
    if(num->top == 0)
        return ERROR;
    *e = num->msg[--num->top];
    return OK;
}
int getTop(numStack *num,int *e){
   
   
    if(num->top == 0)
        return ERROR;
    *e = num->msg[num->top - 1];
    return OK;
}
int isEmpty(numStack *num){
   
   
    return num->top == 0;
}
typedef struct FU{
   
   
    char msg[MAX_SIZE];
    int top;
}fuStack;
void initFuStack(fuStack *fu){
   
   
    fu->top = 0;
}

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值