数据结构 中缀式转后缀式(编译器:VS)

数据结构 中缀式转后缀式

原理:
1.建立一个栈用来储存操作符
2.将中缀式从左到右扫描,如果是数字就存进一个字符串,如果是操作符就遵从以下原则:
若op的优先级高于栈顶的操作符,将该op压栈
若op的优先级低于栈顶的操作符,将栈中的操作符弹出直到栈顶的操作符优先级低于该op,并将弹出的操作符存入刚在的字符串中
若op为“(”,直接压栈
若op为“)”,弹栈直到遇到“(”,且括号舍弃,不存入字符串(后缀式中不具有括号)
3.中缀式扫描完后,将栈中剩余的操作符弹出,存入字符串中

头文件:1.h
数据结构 中缀式转后缀式(编译器:VS)
头文件:2.h(栈的定义)
数据结构 中缀式转后缀式(编译器:VS)
头文件:3.h(各种函数的实现)
#include “1.h”
#include “2.h”
Status InitStack(SqStack &S)
{
S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base) return OVERFLOW;
S.top = S.base;//当前为空
S.stacksize = STACK_INIT_SIZE;
return OK;
}

Status Push(SqStack &S, SElemType e)
{
SElemType newbase;
if ((S.top - S.base) >= S.stacksize)
{
newbase = (SElemType
)realloc(S.base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SElemType));
if (!newbase) return OVERFLOW;
S.base = newbase;
S.top = S.base + S.stacksize;
S.stacksize = STACK_INIT_SIZE + STACKINCREMENT;

}
*S.top = e;
S.top++;
return OK;

}

Status StackEmpty(SqStack S)
{
return (S.base == S.top);
}

Status Pop(SqStack &S, SElemType &e)
{
if (S.base == S.top) return ERROR;
S.top–;
e = *S.top;
return OK;
}
Status GetTop(SqStack S, SElemType &e)
{
if (S.base == S.top) return ERROR;

e = *(S.top - 1);
return OK;

}
void Transform(char s[],char d[])//中缀转后缀
{
SqStack S;
InitStack(S);
SElemType e;//记录栈顶的值
int i,j=0;
for (i = 0; s[i] != ‘\0’; i++)
{
if (s[i] >= ‘0’&&s[i] <= ‘9’)
{
d[j] = s[i];
j++;
}

	if ( s[i] == '(')
			Push(S, s[i]);
	if (s[i] == '+' || s[i] == '-')
	{
			
			if (!GetTop(S, e))
				Push(S, s[i]);
			while (e=='*'||e=='/')
			{
				Pop(S, d[j]);
				j++;
				GetTop(S, e);
				if (StackEmpty(S))
					break;
			}
			Push(S, s[i]);
			
			
	}
	if (s[i] == '*' || s[i] == '/')
	{
			Push(S, s[i]);
	}
	if (s[i] == ')')
	{
		GetTop(S, e);
		while (e != '(')
		{
			Pop(S, d[j]);
			j++;
			GetTop(S, e);
			if (StackEmpty(S))
				continue;
		}
		Pop(S, e);
	}
	

}
while (!StackEmpty(S))
{
	Pop(S, d[j]);
	j++;
}
d[j] = '\0';

}
void Show(char d[])//输出后缀式
{
int i = 0;
for (; d[i] != ‘\0’;i++)
{
cout << d[i]<<" ";
}
}

源函数:
#include “3.h”
int main()
{
char s[100], d[100];//d储存后缀式
cout << “请输入表达式:”;
cin >> s;
Show(s);
Transform(s, d);
cout << “后缀式为:”;
Show(d);//将中缀式转换为后缀式

}