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

📄

📁 out< "please input the number of the nodes"<<endl cin>>nodesNum cout<<"pl
💻
字号:
#include "SqStack.h"
//栈的抽象数据类型

int main()
{//简单表达式的求值,这个表达式只有3类字符,即阿拉伯数值,括号,运算符(+,-,*)
SqStack CS;                    //calculation symbol,运算符栈
SqStack DT;                    //data,操作数栈
InitStack(CS); 
InitStack(DT);                 //栈的初始化
char c;                        //c表示表达式的当前结点
int i=0,cc,e,d1,d2,r;          //i是表达式数组的下标,其它变量具体请看程序。
bool IsSymbol(char );
int Operate(int ,char ,int );
short precede(int ,int );

static char expression[60];     //表达式的输入
cout<<"请输入表达式,请不要忘了在表达式的最后加标记#"<<endl;     //表达式输入,以#表示结束
cin>>expression;                //注意用这种方法输入字符串时,输入的长度如果没有达到60,系统就默认用'\0'填充。
cout<<expression<<endl;


  c=expression[i];Push(CS,'#');
  while(c!='\0'){                // 标记:while1
	   int first=1;              //用于记录c是否是连续出现的第一个数字字符
	   while(!IsSymbol(c)){      //标记:while2
	    	cc=c-'0';
		  if(first==1) {         //如果是连续出现的第一个数字字符,则直接入栈DT。
		   	Push(DT,cc);
            cout<<cc<<" 入数据栈"<<endl;
			first++;
		  }//if
		  else{                  //如果不是连续数字字符的第一个
		     first++;
			 Pop(DT,e);
			 cout<<e<<" 出数据栈"<<endl;
			 cc=e*10+cc;         //求值
		     Push(DT,cc);
			 cout<<cc<<" 入数据栈"<<endl;
		   }//else
          i++;
		  c=expression[i];
	   }//while2
	  
	    cout<<endl;
	    cout<<"c 为 "<<c<<endl;
		if(!GetTop(CS,e)){      //有错误
		     cout<<"表达式有错误2"<<endl;
		     return ERROR;
		 }//if
	    cout<<"运算符栈顶 "<<char(e)<<endl;
	    switch(precede(e,int(c))){
			case 0: //c的优先权高
				   cout<<c<<"入运算符栈"<<endl<<endl;
				   Push(CS,int(c));i++;c=expression[i];
				   break;
			case -1://c是右括号
				   Pop(CS,e);
                   cout<<char(e)<<"出运算符栈"<<endl;
				   i++;c=expression[i];
				   break;
			case 1:
				   Pop(CS,e); cout<<char(e)<<" 出运算符栈"<<endl;
				   Pop(DT,d1);Pop(DT,d2);cout<<"d1为 "<<d1<<'\t'<<" d2为 "<<d2<<"  d1,d2出数据栈"<<endl;
				   r=Operate(d2,char(e),d1);  //计算"d2 e d1"的结果,注意d1,d2的顺序
				   Push(DT,r); 
				   cout<<"d2  "<<char(e)<<"d1 "<<" = "<<r<<endl;cout<<r<<" 入数据栈"<<endl<<endl;
				   //将结果入栈
				   break;
			default:
				cout<<"表达式输入错误3"<<endl;return ERROR;
		}//switch
  }//while1
	
	Pop(DT,e);
	cout<<"表达式的结果为"<<e<<endl;
	if(!StackEmpty(CS)&&!StackEmpty(DT)) { //最后两个栈必须为空,否则表明表达式输入错误
		cout<<"表达式输入有错误4"<<endl;
		return ERROR;
	}//if
   
	cout<<"谢谢使用!!^_^"<<endl;
	return OK;
}//main



//子函数IsSymbol,若输入的参数是数字字符返回0,否则返回1;
bool IsSymbol(char r){
      if(r>='0'&&r<='9') return 0;
	  else
		  return 1;
}//IsSymbol


//子函数Operate,做运算d1 e d2,其中e是运算符,d1,d2是操作数
int Operate(int d1,char e,int d2){
    switch(e){
    	case '+':return d1+d2;
        case '-':return d1-d2;
		case '*':return d1*d2;
		default: cout<<"表达式输入有错误5"<<endl;return ERROR;
	}//switch
}//Operate


//子函数precede用来判断两个运算符的有限级.如果i比j优先,返回1; 反之返回0; -1表示i=(,j=)或者i=j=#;2表示表达式出错了。 
short precede(int i,int j){
	short  precedence[6][6]={{1,1,0,0,1,1},{1,1,0,0,1,1},{1,1,1,0,1,1},{0,0,0,0,-1,2},{1,1,1,2,2,2},{0,0,0,0,2,-1}};
	  char c[2];
	  c[0]=char(i);c[1]=char(j);                          //对int类型的i,j强制类型转换成字符型
	  int ord[2];                                         //c1,c2符号在优先级数组中的序号,取值1,2,3,4,5,6.
	  for(short ii=0;ii<=1;ii++){
		  switch(c[ii]){
		       case '+': ord[ii]=0;break;                 //教训啊,总是那么深刻,查了好久才发现漏了break;
			   case '-': ord[ii]=1;break;
			   case '*': ord[ii]=2;break;
			   case '(': ord[ii]=3;break;
			   case ')': ord[ii]=4;break;
			   case '#': ord[ii]=5;break;
			   default: cout<<"表达式输入有错误6";return ERROR;
		  }//switch
	  }//for
	  return precedence[ord[0]][ord[1]];                  //返回优先数
}//precede




⌨️ 快捷键说明

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