中缀转后缀表达式

算法思路

扫描中缀表达式exp, 遇到一个运算符op时,有以下几种情况:

1. 如果栈空,直接入栈;

2. 当op的优先级大于栈顶运算符时,直接进栈;

3. ··················小于··················,依次出栈运算符并存入后缀表达式postexp,直到栈顶运算符优先级小于op,再将op入栈;

4. 当op为 '(' 时,表示一个子表达式开始,直接入栈;

5. 当op为 ')' 时, 子表达式结束,依次出栈运算符并存入postexp,直到栈顶为'(',再将'(' 出栈;

6. 如果栈顶是'(',op是算术运算符,则直接进栈)

注意:

如果*遇到栈顶也为*,需要将*出栈(也就是说栈顶为同优先级的也要出栈),否则会出错

比如表达式为5*6/5*4,正确的后缀表达式是56*5/4*

如果不出栈同优先级运算符,将会得到5654*/*,这样计算后缀将是错的。

此外,在后缀表达式中的每个数字串末尾添加‘#’,以标识

#include <malloc.h>
#include <iostream>

#define MaxSize 100  
using namespace std;
 
typedef struct {
	char data[MaxSize];
	int top;
}SqStack;

void InitStack(SqStack *&s) {
	s = (SqStack *)malloc(sizeof(SqStack));
	s->top = -1;
}

bool Push(SqStack *&s, char e) {
	if (s->top == MaxSize - 1) return 0;
	s->top++;
	s->data[(s->top)] = e;
	return 1;
}

bool Pop(SqStack *&s, char &e) {
	if (s->top == -1) return 0;
	e = s->data[s->top];
	s->top--;
	return 1;
}

bool GetTop(SqStack *s, char &e) {
	if (s->top == -1) return 0;
	e = s->data[s->top];
	return 1;
}

bool StackEmpty(SqStack *s) {
	return (s->top == -1);
}

void DestroyStack(SqStack *&s) {
	free(s); s = NULL;
}
void trans(char *exp, char postexp[]) {//tranfer the infix exp to postexp
	char e;
	int i = 0;//as postexp's index
	SqStack *Optr;//define operator stack pointer
	InitStack(Optr);
	while (*exp != '\0') {
		switch (*exp) {

		case '(':
			Push(Optr, '(');
			exp++;//continue to scan
			break;
		case ')':
			Pop(Optr, e);
			while (e != '(') {
				postexp[i++] = e;
				Pop(Optr, e);
			}
			exp++;
			break;
		case '+':
		case '-':
			while (!StackEmpty(Optr)) {
				GetTop(Optr, e);
				if (e != '(') {
					postexp[i++] = e;
					Pop(Optr, e);
				}
				else break;
			}
			Push(Optr, *exp);
			exp++;
			break;
		case '*':
		case '/':
			while (!StackEmpty(Optr)) {
				GetTop(Optr, e);
				if (e == '*' || e == '/') {
					postexp[i++] = e;
					Pop(Optr, e);
				}
				else break;
			}
			Push(Optr, *exp);
			exp++;
			break;
		default:
			while (*exp >= '0' && *exp <= '9') {
				postexp[i++] = *exp;
				exp++;
			}
			postexp[i++] = '#';//identify numeric
		}
	}
	while (!StackEmpty(Optr)) {
		Pop(Optr, e);
		postexp[i++] = e;
	}
	postexp[i] = '\0';
	DestroyStack(Optr);
}
int main() {
	
	char exp[] = "(56-20)/(4+2)";
	char postexp[MaxSize];
	trans(exp, postexp);
	cout << postexp;

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值