一:大致思路:
1:将输入的中缀表达式转换为后缀表达式
2:将后缀表达式求值输出
二:规则
1:中缀表达式->后缀表达式
- 如果字符为数字,直接输出
- 如果字符为+或-,若栈为空或者栈顶为’(’,将字符压入栈中;若栈非空或者栈顶非’(’,将元素全部弹出并输出,再将字符压入栈中 *
- 如果字符为*或/,若栈为空或者栈顶为’(’,将字符压入栈中;若栈非空或者栈顶非’(’,判断与栈顶字符优先级,若等于,则将栈顶字符弹出并输出,再将字符压入栈中;否则直接压入栈中
- 如果字符为’(’,直接将字符压入栈中 *
- 如果字符为’)’,将栈中字符逐个弹出并输出,直到遇到’(‘为止,并将’('弹出(不输出) *
- 最后将栈中字符全部弹出并输出
2:后缀表达式求值
- 如果输入的字符为数字,则放入数组,并以’\0’结束;继续接收客户端输入的下一个字符,如果为空格,则将数组转换为double型数据,压入栈中,数组计数器清零
- 如果输入的字符为操作符,从栈中相继弹出两个数据,进行相应的操作运算,并将计算结果压入栈中
- 最后弹栈,将最终计算结果打印出来
三:具体代码如下
建议:先全部复制后,测试正确后再研究代码逻辑
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 5
#define MAXBUFFER 100
#define ERROR 0
#define OK 1
static int i=0; //存放后缀表达式数字的长度,也作为数组下标
static char str[MAXBUFFER]; //存放后缀表达式数组
typedef int Status;
//字符栈,存放后缀表达式
typedef struct Stack_char
{
char *base;
char *top;
int stackSize;
}Stack_char;
//浮点栈,存放后缀表达式求值结果
typedef struct Stack_double
{
double *base;
double *top;
int stackSize;
}Stack_double;
//初始化栈
Status initStack_char(Stack_char *S)
{
S->base = malloc(STACK_INIT_SIZE * sizeof(Stack_char));
if(!(S->base)) exit(0);
S->top = S->base;
S->stackSize = STACK_INIT_SIZE;
return OK;
}
Status initStack_double(Stack_double *S)
{
S->base = malloc(STACK_INIT_SIZE * sizeof(Stack_double));
if(!(S->base)) exit(0);
S->top = S->base;
S->stackSize = STACK_INIT_SIZE;
return OK;
}
//计算栈长度
int stackLength_char(Stack_char S)
{
return (S.top - S.base);
}
int stackLength_double(Stack_double S)
{
return (S.top - S.base);
}
//压栈
Status push_char(Stack_char *S, char e)
{
if((S->top - S->base) >= S->stackSize)