数据结构《中缀表达式转后缀表达式的实现》

主要功能:利用栈将中缀表达式转换成后缀表达式、并对后缀表达式求值。

#include<iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define Maxsize 50
typedef char Elemtype;
typedef struct
{
	Elemtype data[Maxsize];
	int top;
}SqStack;

typedef struct
{
	double data[Maxsize];
	int top;
}SqStack1;
void InitStack(SqStack *&s)
{
	s = (SqStack *)malloc(sizeof(SqStack));
	s->top = -1;
}//初始化栈1
void InitStack1(SqStack1 *&s)
{
	s = (SqStack1 *)malloc(sizeof(SqStack1));
	s->top = -1;
}//初始化栈2
void DestoryStack(SqStack *&s)
{
	free(s);
}//销毁栈1
void DestoryStack1(SqStack1 *&s)
{
	free(s);
}//销毁栈2
bool StackEmpty(SqStack *s)
{
	return(s->top == -1);
}//判断栈是否为空
bool Push(SqStack *&s, Elemtype e)
{
	if (s->top == Maxsize - 1)
		return false;
	s->top++;
	s->data[s->top] = e;
	return true;
}//进栈1
bool Push1(SqStack1 *&s,double e)
{
	if (s->top == Maxsize - 1)
		return false;
	s->top++;
	s->data[s->top] = e;
	return true;
}//进栈2
bool Pop(SqStack *&s, Elemtype &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	s->top--;
	return true;
}//出栈1
bool Pop1(SqStack1 * & s, double &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	s->top--;
	return true;
}//出栈2
bool GetTop(SqStack *s, Elemtype &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}//取栈1顶
bool GetTop1(SqStack1 *s, double &e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}//取栈2顶
 
 //判断括号是否配对 
bool Match(char exp[],int n)
{
	int i=0; char e;
	bool match=true;
	SqStack *st;
	InitStack(st);						//初始化栈
	while (i<n && match)				//扫描exp中所有字符
	{
		if (exp[i]=='(')				//当前字符为左括号,将其进栈
			Push(st,exp[i]);
		else if (exp[i]==')')			//当前字符为右括号
		{
			if (GetTop(st,e)==true)
			{	
				if (e!='(')				//栈顶元素不为'('时表示不匹配
					match=false;
				else
					Pop(st,e);			//将栈顶元素出栈
			}
			else  match=false;			//无法取栈顶元素时表示不匹配
		}
		i++;							//继续处理其他字符
	}
	if (!StackEmpty(st))				//栈不空时表示不匹配
		match=false;
	DestoryStack(st);					//销毁栈
	return match;
}

//中缀转后缀
void trans(char *exp,char postexp[])
{
	char e; 
	SqStack *Optr; //定义运算符栈指针
	InitStack(Optr);//初始化运算符栈
	int i=0;// i作为postexp的下标
	while(*exp!='\0')  //判断是否扫描完成 
	{
		switch(*exp)
		{
		case '(': //判定为左括号
			Push(Optr,'(');//左括号进栈
			exp++;//继续扫描其他字符 
			break;
		case ')': //判定是否为右括号
			Pop(Optr,e); //出栈
			while(e!='(')   //不为e时循环 
			{
				postexp[i++]=e;  //把e存到postexp中
				Pop(Optr,e); //继续出栈e;
			}
			 exp++;  //继续扫描其他字符 
			 break;
			 case '+':
			 case '-':
			 	while(!StackEmpty(Optr)) //栈不为空时循环
				 {
					GetTop(Optr,e); //取栈顶元素
					if(e!='(')
					{
						postexp[i++]=e; //将e存到postexp中
						Pop(Optr,e);   //出栈元素e;
													 
					}
					else
						break;
				} 
				Push(Optr,*exp);//将+或者-进栈
				exp++;//继续扫描其他字符
				break;
			case '*':
			case '/':
				while(!StackEmpty(Optr)) //栈不为空时循环 
				{
					GetTop(Optr,e);  //取栈顶元素e
					if(e=='*'||e=='/')  //将栈顶元素e出栈并存在postexp中 
					{
					postexp[i++]=e;//将e存放在postexp中 
					Pop(Optr,e);//出栈元素
					}
					else
					break;//遇到非*或者非/的元素退出循环		
						
				}
				Push(Optr,*exp);//将*或者/进栈
				exp++;//继续扫描其他字符 
				break;
				default:  //处理数字字符 
				while(*exp>='0'&& *exp<='9')  //判定是否为字符 
				{
					postexp[i++]=*exp;
					exp++; 	
				 } 
				 postexp[i++]='#';//用#标记数字结束
				 }		
				}
				while(!StackEmpty(Optr))//exp扫描结束,栈不为空时循环 
				{
					Pop(Optr,e);//元素e出栈
					postexp[i++]=e;//将e存到postexp中
				 }
				 postexp[i]='\0';//给postexp表达式添加结束标志
				 DestoryStack(Optr);//销毁栈 				 
}

//计算后缀表达式的值
//计算后缀表达式的值
double compvalue(char *postexp)
{
	double d,a,b,c,e;
	
	SqStack1 *Opnd; //定义操作数栈
	InitStack1(Opnd); //初始化操作数栈
	while(*postexp!='\0') 
	{
	
		switch(*postexp)
		{	
			case '+'://判定为+号
			Pop1(Opnd,a);//出栈元素a
			Pop1(Opnd,b);//出栈元素b
			c=b+a;//计算c
			Push1(Opnd,c);//计算结果c进栈
			break;
			
			case '-'://判定为-号
			Pop1(Opnd,a);//出栈元素a
			Pop1(Opnd,b);//出栈元素b
			c=b-a;//计算c
			

			Push1(Opnd,c);//计算结果c进栈
			break;
			
			case '*'://判定为*号
			Pop1(Opnd,a);//出栈元素a
			Pop1(Opnd,b);//出栈元素b
			c=b*a;//计算c
			Push1(Opnd,c);//计算结果c进栈
			break; 
			
			case '/'://判定为+号
			Pop1(Opnd,a);//出栈元素a
			Pop1(Opnd,b);//出栈元素b
			if(a!=0)
			{
				c=b/a;//计算c
				Push1(Opnd,c);//计算结果c进栈
//				cout<<c<<endl;
				break;
			}
			
			else
			{
				cout<<"除零错误"<<endl;
				exit(0);//异常退出 
			}
			break;
			
		default://处理数字字符
			d=0;
			while(*postexp>='0'&& *postexp<='9')//判定是否为数字字符
			{
			d=10*d+*postexp-'0';
			postexp++;

			} 
			Push1(Opnd,d);//计算结果d进栈
			break;	 		
		}
		postexp++;//继续处理其他字符
		
	} 
	GetTop1(Opnd,e);//取栈顶元素e
	DestoryStack1(Opnd);
	return e;
			
 } 
			

int main()
{
	double n;
	int k;
	system("color 00a");
	int m;//m为字符串长度 
//	char exp[]="(56-20)";
//	char exp[]="(56-20)/(4+2)";
	char postexp[100];
	
	cout<<"请输入你的表达式"<<endl; 
//	cin>>m;
//	cout<<"输入表达式"<<endl; 
	char exp[100];
	cin.getline(exp, 14);
	cout<<"输入表达式成功"<<endl;
	cout<<"输入【0】程序退出"<<endl;
	cout<<"输入【1】判断表达式是否配对"<<endl;
	cout<<"输入【2】计算后缀表达式"<<endl;
	cout<<"输入【3】输出计算结果"<<endl;
	cout<<"请输入你的操作"<<endl;
	cin>>k;
	while(k!=0)
	{
		if(k==0)
		{
			cout<<"即将退出程序"<<endl; 
			break;
		}
		else if(k==1)
		{
		if (Match(exp,strlen(exp))==1)
		cout<<"表达式括号配对,请继续其他操作"<<endl;
		else
		{
		cout<<"表达式括号不配对"<<endl;
		cout<<"程序退出"<<endl;
		break; 
		}
		
		}
		else if(k==2)
		{
			trans(exp,postexp);
	cout<<"后缀表达式为"<<postexp<<endl;
		}
		else if(k==3)
		{
		cout<<"计算的结果为:"<<compvalue(postexp)<<endl;	
		}
		cout<<"请输入你的操作"<<endl;
		cin>>k;		
	 } 
	

}
//(56-20)/(4+2)

猜你喜欢

转载自blog.csdn.net/qq_40605167/article/details/86425292
今日推荐