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

📄 expressex.cpp

📁 利用堆栈进行表达式的计算
💻 CPP
字号:
// ExpressEx.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "Stack.h"
#include "String.h"
#include "OPObject.h"
#include "IntObject.h"

//return 0: >
//return 1: <
//return 2: =
//return 3: no relation
int F(char op1, char op2)
{
	switch(op1)
	{
	case '+':
		switch(op2)
		{
		case '+':
			return 0;
		case '-':
			return 0;
		case '*':
			return 1;
		case '/':
			return 1;
		case '(':
			return 1;
		case ')':
			return 0;
		case '#':
			return 0;
		};
	case '-':
		switch(op2)
		{
		case '+':
			return 0;
		case '-':
			return 0;
		case '*':
			return 1;
		case '/':
			return 1;
		case '(':
			return 1;
		case ')':
			return 0;
		case '#':
			return 0;
		};
	case '*':
		switch(op2)
		{
		case '+':
			return 0;
		case '-':
			return 0;
		case '*':
			return 0;
		case '/':
			return 0;
		case '(':
			return 1;
		case ')':
			return 0;
		case '#':
			return 0;
		};
	case '/':
		switch(op2)
		{
		case '+':
			return 0;
		case '-':
			return 0;
		case '*':
			return 0;
		case '/':
			return 0;
		case '(':
			return 1;
		case ')':
			return 0;
		case '#':
			return 0;
		};
	case '(':
		switch(op2)
		{
		case '+':
			return 1;
		case '-':
			return 1;
		case '*':
			return 1;
		case '/':
			return 1;
		case '(':
			return 1;
		case ')':
			return 2;
		case '#':
			return 3;
		};
	case ')':
		switch(op2)
		{
		case '+':
			return 0;
		case '-':
			return 0;
		case '*':
			return 0;
		case '/':
			return 0;
		case '(':
			return 3;
		case ')':
			return 0;
		case '#':
			return 0;
		};
	case '#':
		switch(op2)
		{
		case '+':
			return 1;
		case '-':
			return 1;
		case '*':
			return 1;
		case '/':
			return 1;
		case '(':
			return 1;
		case ')':
			return 3;
		case '#':
			return 2;
		};
	};
	return 3;
}
int main(int argc, char* argv[])
{
	//save expression inputed
	char express[1000];

	CStack numStack;
	CStack opStack;

	int idx = 0;
/******************************************************************************************/
	//输入一个表达式
	cin>>express;

	//use two '#' enclose expression
	strcat(express,"#");
	//initialize op stack
/*****************************************************************************************/
	
	opStack.push(new COPObject('#'));

	while(opStack.getLength() > 0)
	{
		if(idx >= (signed)strlen(express))
		{
			cout<<"ERROR: outof the scape of expression.\n";
			return 0;
		}

		if(express[idx] >= '0' && express[idx] <= '9')//means it's a number
		{
			numStack.push(new CIntObject(express[idx] - '0'));
			idx++;
			continue;
		}
		else
		{
			while(F(((COPObject *)opStack.getTop())->data , express[idx]) == 0)
			{
				char op = ((COPObject *)opStack.pop())->data;
				if(numStack.getLength() < 2)
				{
					cout<<"ERROR: number is less than needs in numStack.\n";
					return 0;
				}
				int n2 = ((CIntObject *)numStack.pop())->data;
				int n1 = ((CIntObject *)numStack.pop())->data;
				int res = 0;
				switch(op)
				{
				case '+':
					res = n1 + n2;
					break;
				case '-':
					res = n1 - n2;
					break;
				case '*':
					res = n1 * n2;
					break;
				case '/':
					res = n1 / n2;
					break;
				default:
					cout<<"ERROR:......\n";
					return 0;
				};
				numStack.push(new CIntObject(res));
			};
			
			if(F(((COPObject *)opStack.getTop())->data,express[idx]) == 2)
			{
				opStack.pop();
				idx++;
				continue;
			}
			opStack.push(new COPObject(express[idx]));
			idx++;
		}
	}
	if(numStack.getLength() != 1)
	{
		cout<<"ERROR: no result calculated.\n";
		return 0;
	}

	cout<<((CIntObject *)numStack.pop())->data;


	return 0;
}

⌨️ 快捷键说明

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