⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 数据结构中堆栈的具体应用
💻 CPP
字号:
//算术表达式运算的主程序
#include <iostream.h>
#include <stdio.h>
#include "OPTRRel.h"
#include "ExpIn.h"
#include "LinkedTypeStack.h"

bool IsBracMat(char *ch);   //判断表达式中的括号是否匹配
int  Char2int(char *ch);    //字符转换成整数
void AnaCh(char *ch,double &result,int &index,int &preindex,int &dot,double &factor);   
//分析字符
void Compute(LinkedTypeStack<double> &OPND,LinkedTypeStack<char> &OPTR,bool &expressionOK);
//操作数栈和操作符栈进行一次运算

void main()
{
//////////////////////////////////////////////////
//表达式输入,并且进行解析,完成字符到数字的转换
	char  *expression;     //数组存储输入表达式
	
	OPTRRel OPTRRel;       //运算符关系类

	LinkedTypeStack<double>  OPND;   //数字堆栈,存放运算数
	LinkedTypeStack<char> OPTR;   //字符堆栈,存放运算符

	///开始解析表达式
	double result;                   //数字转换结果
	int index;                    //存此次转换的类型
	int preindex=0;               //存此次转换的类型
	int dot=0;					  //小数点,默认刚开始没有小数点
	double factor=0.1;                 //缩小倍数因子
	char *ch;
	bool expressionOK;            //计算过程中表达式是否正确
	char command='0';
	
	while(command=='0')
	{
		
		cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
		cout<<"Input command:  1-input expression;  2-quit"<<endl;
		cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<endl;

		while((command!='1')&&(command!='2'))
		{
			cout<<"Input command:"<<endl;
			cin>>command;
			if((command!='1')&&(command!='2'))
				cout<<"1 or 2 is expected!"<<endl;
		}

		cout<<"\n"<<endl;

		if(command=='1')
		{
			ExpIn ExpIn;           //输入类的实例
			expression=ExpIn.Exp;
			cout<<"The input expression is:"<<expression<<endl;
			
			OPTR.Push('#');               //存放'#'
			
			ch=(++expression);

			
			if(!IsBracMat(ch))            //验证表达式中的括号是否匹配
			{
				cerr<<"Brackets not match!!!"<<"Input the expression again!"<<endl;
				//break;         
			}

			else
			{
				cout<<"\n"<<endl;
				cout<<"Steps:"<<endl;
				cout<<"............................................................................"<<endl;
				cout<<"OPND CHANGE\tOPTR CHANGE\tEXPRESSION CHANGE"<<endl;
				cout<<"............................................................................"<<endl;
			
				while(*ch!='#')     //表达式没结束继续
				{
				
					//cout<<"........................................................."<<endl;
					cout<<"\t\t\t\tRemaining expression to be calculated:	"<<endl;
					cout<<"\t\t\t\t\t"<<ch<<endl;
					//cout<<"\t\t\t\tThe char to be processed:	"<<endl;
					//cout<<"\t\t\t\t\t"<<*ch<<endl;
					//cout<<"........................................................."<<endl;
				
					AnaCh(ch,result,index,preindex,dot,factor);   //转换

					switch(index)
					{
					case 0:     //转换中的表达式错误
						cerr<<"Expression ERROR!!!"<<"Input expression again!"<<endl;
						break;
					case 1:     //操作数
						if((index==preindex)||(dot==1))
						{
							cout<<"OPND.Pop("<<OPND.GetTop()<<")"<<endl;
							OPND.Pop();
						}
						cout<<"OPND.Push("<<result<<")"<<endl;
						OPND.Push(result);
						break;
						//case 9:     //结束符
						//Compute(OPND,OPTR,expressionOK);
						//break;
					case 10:
						break;
					default:
						switch(OPTRRel.GetRel(OPTR.GetTop(),*ch))    //比较当前运算符和运算符栈顶运算符的优先级关系
						{
						case '>':
							
							if(index==8)
							{
								Compute(OPND,OPTR,expressionOK);
								
								//////////////////////////////////
								//if(!expressionOK)     //判断表达式是否正确
								//{
								//	command='0';    //初始化command
								//	preindex=0;   //初始化preindex
								//	break;
								//	break;
								//}
								////////////////////////////////////

								if(OPTR.GetTop()=='(')    //如果堆栈中前一个是(,则运算符堆栈弹出栈顶元素
								{
									cout<<"\t\tOPTR.Pop("<<OPTR.GetTop()<<")"<<endl;
									OPTR.Pop();
								}
								else
									ch--;
							}
							else if((index!=7)&&(index!=8)&&(OPTR.GetTop()!='('))
							{
								while(OPTRRel.GetRel(OPTR.GetTop(),*ch)=='>') 
									//一直运算,直到即将输入的运算符优先级高
									Compute(OPND,OPTR,expressionOK);
								
								OPTR.Push(*ch);         //ch非括号、非^之后入站
								cout<<"\t\tOPTR.Pop("<<OPTR.GetTop()<<")"<<endl;
							
							}
							else
							{
								OPTR.Push(*ch);        //其余运算符入栈	
								cout<<"\t\tOPTR.Push("<<OPTR.GetTop()<<")"<<endl;
							}
							break;
						case '=':
							break;
						case '<':
							OPTR.Push(*ch);
							cout<<"\t\tOPTR.Push("<<OPTR.GetTop()<<")"<<endl;
							break;
						default:
							cerr<<"Expression ERROR!"<<endl;  //报错处理
							break;
						}//end switch
						break;
					}//end switch

					if(index==0)
					{
						command='0';    //初始化command
						preindex=0;   //初始化preindex
						break;
					}

					ch++;          //ch指向下一个转换字符
					preindex=index;
				}//end while

				//////////////////////////////////////
			//	if(index==0)
			//	{
			//		command='0';    //初始化command
			//		preindex=0;   //初始化preindex
			//		break;
			//	}
				//////////////////////////////////////

				if(index!=0)
				{
					while(OPTR.GetTop()!='#')
						Compute(OPND,OPTR,expressionOK);    //最后的运算
				}
				////////////////////////////////////////////
				//if(!expressionOK)     //判断表达式是否正确
				//{
				//	command='0';    //初始化command
				//	preindex=0;   //初始化preindex
				//	break;
				//}
				////////////////////////////////////////////
				
				if((expressionOK!=FALSE)&&(index!=0))
				{
					cout<<"\n"<<endl;
					cout<<"Value of the input expression is: "<<OPND.GetTop()<<endl;  //输出最终的结果
					cout<<"******************************************************************"<<endl;
					cout<<"End of this computing!"<<endl;
					cout<<"******************************************************************"<<endl;
				}
				
				cout<<"\n\n"<<endl;
				
				//cout<<""<<endl;
				//cout<<""<<endl;
				
				OPND.DestroyStack();    //清空操作数栈
				OPTR.DestroyStack();    //清空运算符栈

				command='0';    //初始化command
				preindex=0;   //初始化preindex
			}//end else
		}//end if
	
		else
			break;
	}//end while
//	OPND.DestroyStack();    //销毁操作数栈
//	OPTR.DestroyStack();    //销毁运算符栈
}


//判断表达式中的括号是否匹配
bool IsBracMat(char *ch)
{
	LinkedTypeStack<char> bracket;
	while(*ch!='#')
	{
		if(*ch=='(')
			bracket.Push(*ch);     //'('压栈
		else if(*ch==')')
		{
			if(bracket.GetTop()=='(')
				bracket.Pop();     //')'出栈
			else
				break;
		}

		ch++;
	}//end while

	if((*ch=='#')&&bracket.IsEmptyStack())
		return TRUE;
	else
		return FALSE;
}//end IsBracMat()

//字符转换成整数的函数
int  Char2int(char *ch)    
{
	int result;
	//进行字符到整数的转换
	switch(*ch)
	{
	case '0':   //数字0
		result=0;
		break;
	case '1':   //数字1
		result=1;
		break;
	case '2':   //数字2
		result=2;
		break;
	case '3':   //数字3
		result=3;
		break;
	case '4':   //数字4
		result=4;
		break;
	case '5':   //数字5
		result=5;
		break;
	case '6':   //数字6
		result=6;
		break;
	case '7':   //数字7
		result=7;
		break;
	case '8':   //数字8
		result=8;
		break;
	case '9':   //数字9
		result=9;
		break;
	default:
		cerr<<"ERROR!"<<endl;  //报错处理
		break;
	}//end switch
	return result;
}//end Char2int

//判断ch是否是操作数
void AnaCh(char *ch,double &result,int &index,int &preindex,int &dot,double &factor)   
//result存放数字转换结果,index代表了转换字符的类型;
//preindex代表前次转换的类型,dot代表每单元操作数出现小数点与否
//1-数,2-'+',3-'-',4-'*',5-'/',6-'^',7-'(',8-')',9-'#',0-Error,10-小数点
//expressionOK反映表达式的正确与否,正里面包含了对表达式的验证
{
	int sign=0;      //判断的标志
	int temp=0;
//	int factor=1;    //缩小倍数因子
//	extern int char2int(char *ch);

	if((*ch>='0')&&(*ch<='9'))   //ch是数
	{
		index=1;
		temp=Char2int(ch);
		if((index==preindex)&&(dot==0))
		{
			result=10*result+temp;   //处理多位数
		}
		else if(dot==1)  //处理小数点后的数
		{
			result=result+temp*factor;
			factor=factor*0.1;
		}
		else
		{
			result=temp;              //处理一位数的情况
			factor=0.1;
			dot=0;
		}
	}

	else if(*ch=='+')     //+
	{
		if((preindex!=1)&&(preindex!=8))
			index=0;
		else 
		{
			dot=0;
			index=2;
		}
	}

	else if(*ch=='-')     //-
	{
		if((preindex!=1)&&(preindex!=8))
			index=0;
		else
		{
			dot=0;
			index=3;
		}
	}

	else if(*ch=='*')     //*
	{
		if((preindex!=1)&&(preindex!=8))
			index=0;
		else 
		{
			dot=0;
			index=4;
		}
	}
	
	else if(*ch=='/')     ///
	{
		if((preindex!=1)&&(preindex!=8))
			index=0;
		else 
		{
			dot=0;
			index=5;
		}
	}

	else if(*ch=='^')     //^
	{
		if((preindex!=1)&&(preindex!=8))
			index=0;
		else 
		{
			dot=0;
			index=6;
		}
	}

	else if(*ch=='(')     //(
	{
		if((preindex==1)||(preindex==8))
			index=0;
		else 
		{
			dot=0;
			index=7;
		}
	}

	else if(*ch==')')     //)
	{
		if((preindex==7)||(preindex==9))
			index=0;
		else 
		{
			dot=0;
			index=8;
		}
	}

	else if(*ch=='#')     //#
	{
		if((preindex!=1)||(preindex!=8))
			index=0;
		else 
		{
			dot=0;
			index=9;
		}
	}

	else if(*ch=='.')     //.
		if((preindex!=1)||(dot==1))
			index=0;
		else 
		{
			dot=1;
			index=10;
		}

	else		         //其他字符
		index=0;
}

//计算两个操作数和一个运算符的函数
void Compute(LinkedTypeStack<double> &OPND,LinkedTypeStack<char> &OPTR,bool &expressionOK)
{
	double op1,op2;   //参与运算的操作数
	char optr;        //运算符
	int i;
	double temp=1;

	if(OPND.IsEmptyStack())
	{
		cout<<"	(Not enough oprands!)"<<endl;
		expressionOK=FALSE;
	}
	else
	{
		op2=OPND.GetTop();     //取第二个操作数
		cout<<"OPND.Pop("<<op2<<")"<<endl;
		OPND.Pop();

		if(OPND.IsEmptyStack())
		{
			cout<<"	(Not enough oprands!)"<<endl;
			expressionOK=FALSE;
		}
		else
		{
			op1=OPND.GetTop(); //取第一个操作数
			cout<<"OPND.Pop("<<op1<<")"<<endl;
			OPND.Pop();

			if(OPTR.GetTop()=='#')
			{
				cout<<"	(Not enough oprator!)"<<endl;
				expressionOK=FALSE;
			}
			else 
			{
				optr=OPTR.GetTop();  //取运算符
				cout<<"\t\tOPTR.Pop("<<optr<<")"<<endl;
				OPTR.Pop();

				switch(optr)
				{
				case '+':    //加法
					OPND.Push(op1+op2);
					break;
				case '-':    //减法
					OPND.Push(op1-op2);
					break;
				case '*':    //乘法
					OPND.Push(op1*op2);
					break;
				case '/':    //除法
					if(op2!=0)
						OPND.Push(op1/op2);
					else
					{
						cout<<"	(Divided by ZERO!)"<<endl;
						expressionOK=FALSE;
					}
					break;
				case '^':    //幂
					for(i=1;i<=(abs(op2/1));i++)
					{
						if(op2>0)		   //指数为正
							temp=temp*op1;
						else if(op2<0)	   //指数为负
							temp=temp/op1;					
					}//end for
					OPND.Push(temp);
					break;
				default:
					cout<<"	(Illegal operator!!)"<<endl;
					expressionOK=FALSE;
				}//end switch

				cout<<"OPND.Push("<<OPND.GetTop()<<")"<<endl;

			}//end else
		}//end else
	}//end else
}//end evalue

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -