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