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

📄 3.cpp

📁 设计一个表达式解析器
💻 CPP
字号:
#include <iostream>
#include <string>
#include "stack.h"
#define ISOP(a) ( (a)=='+'||(a)=='-'||(a)=='*'||(a)=='/'||(a)=='('||(a)==')' )
using namespace std;



double inputNumber(char** ppstr)
{
	double dResult =0;
	char* pstr = *ppstr;
	while ('0'<=*pstr && *pstr<='9')
	{
		dResult*=10;
		dResult+=*pstr-'0';
		pstr++;
	}
	double dT = 0.1;
	if (*pstr=='.')
	{
		pstr++;
		while ('0'<=*pstr && *pstr<='9')
		{
			dResult+=(*pstr-'0')*dT;
			dT/=10;
			pstr++;
		}
	}
	*ppstr = pstr;
	return dResult;
}
int isp(char x){                  //栈内优先级判断
//	assert(x == '#' || x == '+' || x == '-' || x == '*' || x == '/'||x=='('||x==')');
	switch(x){
	case'#':return 0;
	case'+':return 3;
	case'-':return 3;
	case'*':return 5;
	case'/':return 5;
	case'(':return 1;
	case')':return 8;
	}
	return -1;
}
int icp(char x){              //栈外优先级判断
//	assert( x == '+' || x == '-' || x == '*' || x == '/'||x=='('||x==')');
	switch(x){
	case'+':return 2;
	case'-':return 2;
	case'*':return 4;
	case'/':return 4;
	case'(':return 8;
	case')':return 1;
	}
	return -1;
}
void infix2postfix(char* pstr)
{
	Stack<double> dStack;//for operands
	Stack<char> cStack;//for operator
	cStack.Push('#');
	double dT;
	char cT;
// 	if ('0'<=*pstr && *pstr<='9')
// 	{
// 		dT=inputNumber(&pstr);
// 		dStack.Push(dT);
// 	}
// 	if (ISOP(*pstr))
// 	{
// 		cT =*pstr++;
// 		cStack.Push(cT);	
// 	}
	double op1,op2;
	char op;
	while (*pstr != '=')
	{
		if ('0'<=*pstr && *pstr<='9')
		{
			dT = inputNumber(&pstr);
			dStack.Push(dT);
		}
		else if (ISOP(*pstr))
		{
			cT = *pstr++;
			if (icp(cT)>isp(cStack.Top()))
			{
				cStack.Push(cT);
			}
			else if (cT==')')
			{
				op = cStack.Pop();
				while (op!='(')
				{
					if (!dStack.IsEmpty())
					{
						op2 = dStack.Pop();
					}
					else
					{
						cout<<"操作数错误!"<<endl;return;
					}
					if (!dStack.IsEmpty())
					{
						op1 = dStack.Pop();
					}
					else
					{
						cout<<"操作数错误!"<<endl;return;
					}
					
					if (op=='/' && op2 == 0.0)
					{
						cout<<"除数不能为零!"<<endl;return;
					}
					switch(op)
					{
						case '+':
							dStack.Push(op1+op2);break;
						case '-':
							dStack.Push(op1-op2);break;
						case '*':
							dStack.Push(op1*op2);break;
						case '/':
							dStack.Push(op1/op2);break;
						default:
							break;
					}
					if (!cStack.IsEmpty())
					{
						op = cStack.Pop();
					}
					else
					{
						cout<<"操作符错误"<<endl;return;
					}
				}
			}
			else
			{
				do 
				{
					if (!cStack.IsEmpty())
					{
						op = cStack.Pop();
					}
					else
					{
						cout<<"操作符错误"<<endl;return;
					}

					if (!dStack.IsEmpty())
					{
						op2 = dStack.Pop();
					}
					else
					{
						cout<<"操作数错误!"<<endl;return;
					}
					if (!dStack.IsEmpty())
					{
						op1 = dStack.Pop();
					}
					else
					{
						cout<<"操作数错误!"<<endl;return;
					}
					
					if (op=='/' && op2 == 0.0)
					{
						cout<<"除数不能为零!"<<endl;return;
					}
					switch(op)
					{
						case '+':
							dStack.Push(op1+op2);break;
						case '-':
							dStack.Push(op1-op2);break;
						case '*':
							dStack.Push(op1*op2);break;
						case '/':
							dStack.Push(op1/op2);break;
						default:
							break;
					}
										
				} while(icp(cT)<=isp(cStack.Top()));
				cStack.Push(cT);
			}
		}
		else
		{
			cout<<"Illegal Ops!"<<endl;
			return;
		}	
	}
	while (cStack.Top()!='#')
	{
					if (!dStack.IsEmpty())
					{
						op2 = dStack.Pop();
					}
					else
					{
						cout<<"操作数错误!"<<endl;return;
					}
					if (!dStack.IsEmpty())
					{
						op1 = dStack.Pop();
					}
					else
					{
						cout<<"操作数错误!"<<endl;return;
					}
					if (!cStack.IsEmpty())
					{
						op = cStack.Pop();
					}
					else
					{
						cout<<"操作符错误"<<endl;return;
					}
					if (op=='/' && op2 == 0.0)
					{
						cout<<"除数不能为零!"<<endl;return;
					}
					switch(op)
					{
						case '+':
							dStack.Push(op1+op2);break;
						case '-':
							dStack.Push(op1-op2);break;
						case '*':
							dStack.Push(op1*op2);break;
						case '/':
							dStack.Push(op1/op2);break;
						default:
							break;
					}
	}
	cout<<dStack.Top()<<endl;
}

int main(int argc, char* argv[])
{
	char szInput[512];
	if (argc>1)
	{
		strcpy(szInput,argv[1]);
	}
	else
	{
		cin>>szInput;
	}
	//cout<<szInput<<endl;
	infix2postfix(szInput);
	
	return 0;
}

⌨️ 快捷键说明

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