在convert函数中遵循如下规则:
具体过程为:1.创建栈
2.从左向右顺序获取中缀表达式
①.数字直接输出
②.运算符
一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。
二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。
三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优先级,所以也依次弹栈)直到栈空或则遇到左括号为止,停止弹栈。(因为左括号要匹配右括号时才弹出)。
四:获取完后,将栈中剩余的运算符号依次弹栈输出
例:比如将:2*(9+6/3-5)+4转化为后缀表达式 2 9 6 3 / +5 - * 4 +
代码呈现:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#define STACK_INT_SIZE 10
#define STACKINCREMENT 5
typedef char ElemType;
typedef struct {
ElemType *base;
ElemType *top;
int stacksize;
} SqStack;
int initStack(SqStack *s);
int emptyStack(SqStack *s);
int pushStack(SqStack *s, ElemType e);
int popStack(SqStack *s, ElemType *e);
int getTop(SqStack *s, ElemType *e);
int initStack(SqStack *s) {
s->base = (ElemType *)malloc(sizeof(ElemType) * STACK_INT_SIZE);
if (!s->base)
return 0;
s->top = s->base;
s->stacksize = STACK_INT_SIZE;
return 1;
}
int emptyStack(SqStack *s) {
if (s->top == s->base)
return 1;
else
return 0;
}
int pushStack(SqStack *s, ElemType e) {
if (s->top - s->base >= s->stacksize) {
s->base = realloc(s->base, (STACK_INT_SIZE + STACKINCREMENT) * sizeof(ElemType));
if (!s->base)
return 0;
s->top = s->base + s->stacksize;
s->stacksize += STACKINCREMENT;
}
*s->top++ = e;
return 1;
}
int popStack(SqStack *s, ElemType *e) {
if (s->base == s->top)
return 0;
*e = *--s->top;
return 1;
}
int getTop(SqStack *s, ElemType *e) {
if (s->base == s->top)
return 0;
*e = *(s->top - 1);
return 1;
}
//运算符优先级:可根据需要设计。
int f(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
case ')':
return 4;
}
}
//后缀式转换
void convert(char *exp, char *result) {
int i = 0, j = 0;
char e;
SqStack s;
initStack(&s);
while (exp[i] != '#') {
if (exp[i] >= '0' && exp[i] <= '9') {
result[j] = exp[i];
j++;
i++;
while (exp[i] >= '0' && exp[i] <= '9') {
result[j] = exp[i];
j++;
i++;
}
result[j] = ' ';
j++;
} else if (exp[i] == '(' ) {
pushStack(&s, exp[i]);
i++;
} else if (exp[i] == ')') { //'=='很重要
getTop(&s, &e);
while (e != '(') {
result[j] = e;
j++;
result[j] = ' ';
j++;
popStack(&s, &e);
getTop(&s, &e);
}
i++;
} else {
if (!emptyStack(&s)) {
getTop(&s, &e);
if (f(e) >= f(exp[i])) { //栈顶元素优先级大于/等于新来的元素
popStack(&s, &e);
result[j] = e;
j++;
result[j] = ' ';
j++;
} else { //小于新来的元素
pushStack(&s, exp[i]);
i++;
}
} else { //emptyStack
pushStack(&s, exp[i]);
i++;
}
}
}
while (!emptyStack(&s)) {
popStack(&s, &e);
result[j++] = e;
result[j++] = ' ';
}
result[j] = '\0';
}
int main() {
char result[80] = {'\0'}, exp[80] = {'\0'};
char e;
int i, j;
while (1) {
i = 0;
printf("请输入中缀表达式,以#结束:");
while (scanf("%c", &e) != EOF && e != '\n') {
exp[i++] = e;
}
exp[i] = '\0';
if (e == EOF) {
break;
}
convert(exp, result);
j = 0;
while (result[j] != '\0') {
printf("%c ", result[j]);
j++;
}
printf("\n");
}
return 0;
}
#yyds干货盘点#