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

📄 postfix.h

📁 数学表达式计算器数学表达式计算器数学表达式计算器
💻 H
字号:
#include"Stack.h"             //链式栈类,模板
#include"string.h"
#include"math.h"
typedef long double type;
                         
char* toPostfix(char *expstr)     //将中缀表达式转换成后缀表达式
{
	Stack<char> s1;              //创建空栈,数据元素类型为char
	char *poststr=new char[strlen(expstr)+1];
	char out;
	int i=0,j=0;
	while(expstr[i]!='\0')
	{
	//	cout<<"expstr["<<i<<"]="<<expstr[i];
		switch(expstr[i])
		{
		case '+':
		case '-':            //遇见+、-运算符时,与栈顶元素比较
			while(!s1.isEmpty() && s1.get()!='(')
			{
				poststr[j]=s1.pop();
				j++;
			}
			s1.push(expstr[i]);   //当前运算符入栈
			i++;
			break;

		case 't':
		case 's':
		case 'C':
		case 'c':
		case 'l':
		case 'L':
			 while(!s1.isEmpty() && (s1.get()=='t' || s1.get()=='s'  || s1.get()=='C' || s1.get()=='c'  || s1.get()=='l' || s1.get()=='L'))
			 {
				 poststr[j]=s1.pop();
				 j++;
			 }
			 s1.push(expstr[i]);
			 i++;
			 break;


		case '*':
		case '/':          //遇见*、/运算符时,与栈顶元素比较
			while(!s1.isEmpty() && (s1.get()=='*' || s1.get()=='/'))
			{
				poststr[j]=s1.pop();
				j++;
			}
			s1.push(expstr[i]);  //当前运算符入栈
			i++;
			break;


		case '(':       //遇见左括号时,入栈
			s1.push(expstr[i]);
			i++;
			break;
		case ')':      //遇见右括号时,出栈
			out=s1.pop();
			while(!s1.isEmpty() && out!='(')   //判断出栈的是否为左括号
			{            
				poststr[j]=out;
				j++;
				out=s1.pop();
			}
			i++;
			break;

		case 'P':
			while(expstr[i]=='P')
			{
				poststr[j]=expstr[i];
				i++;
				j++;
			}
			poststr[j]=' ';
			j++;
			break;


		case '0': case '1': case '2': case '3':case '4': case '5': case '6': case '7': case '8': case '9':   
			while(expstr[i]>='0' && expstr[i]<'9' && expstr[i]!='\0')
			{                            //遇见数字时,加入到后缀表达式
				poststr[j]=expstr[i];
				i++;
				j++;

			}
			
			poststr[j]=' ';       //数字之间以空格分离
			j++;
			break;
		
		default:
			while(expstr[i]!='\0')
			{
				cout<<"    对不起,您的输入有误,请重新输入!\n";
				i++;
			}
		}

		poststr[j]='\0';
	//	cout<<"  poststr="<<poststr<<"\t";
	//	cout<<s1;
	}

	while(!s1.isEmpty())
	{
		poststr[j]=s1.pop();
		j++;
	}


	poststr[j]='\0';      //后缀表达式字符串加结束符
	return poststr;
}


type value(char *poststr)    //计算后缀表达式的值
{
	Stack<type> s2;       //创建空栈,数据元素类型为type
	char *p=poststr;
	type x,y,z,h;
	while(*p!='\0')     //逐个检查后缀表达式中的字符
	{
	//	cout<<"*p="<<*p<<"  ";
		if(*p>='0' && *p<='9')   //遇到数字字符
		{
			z=0;
			while(*p!=' ')   //字符串转化为数值
			{
				z=z*10+*p-'0';
				p++;
			}
			s2.push(z);   //z值入栈
			p++;
		}
		else if(*p=='P')
		{
			while(*p=='P')
			{
				z=3.141592654;
				p++;
			}
			s2.push(z);
			p++;
		}


		else
		{	
			if(*p!=' ' &&  (*p=='t' || *p=='C' || *p=='s' || *p=='c' || *p=='l' || *p=='L')) 
			{
				h=s2.pop();
				switch(*p)
				{
				case 't': z=tan(h); break;
 		    	case 's': z=sin(h);  break;
		    	case 'C': z=1/tan(h); break;
		    	case 'c': z=cos(h);  break;
			    case 'l': z=log10(h);break;
		    	case 'L': z=log(h);  break;
				}
				s2.push(z);
				p++;
			}
			
			else if(*p!=' ')
			{				
				y=s2.pop();   //出栈两个值
				x=s2.pop();
				switch(*p)   //根据运算符,计算结果
				{
				case '+':z=x+y; break;
				case '-':z=x-y; break;
				case '*':z=x*y; break;
				case '/':z=x/y; break;
				}
				s2.push(z);   //计算结果再次入栈
				p++;
			}
		}
	//	cout<<s2;
	}
	return s2.pop();
}

⌨️ 快捷键说明

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