在convert函数中遵循如下规则:

中缀转后缀表达式(C)_运算符

具体过程为: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干货盘点#