数据结构--算数表达式求值

Posted bd1a489

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--算数表达式求值相关的知识,希望对你有一定的参考价值。

#include "pch.h"
#include <windows.h>
#include <iostream>
#include <stack>
using std::stack;
using std::cin;
using std::cout;
using std::endl;
using std::cerr;
/*    
	  0 1 2 3 4 5 6
 	  + - * / ( ) #
  0	+ > > < < < > >
  1	- > > < < < > >
  2	* > > > > < > >
  3	/ > > > > < > >
  4	( < < < < < = 
  5	) > > > >   > >
  6	# < < < < <   =
*/
/*
	> 2
	< 1
	= 0
*/

BYTE order[7][7] = {
	{2,2,1,1,1,2,2},
	{2,2,1,1,1,2,2},
	{2,2,2,2,1,2,2},
	{2,2,2,2,1,2,2},
	{1,1,1,1,1,0,255},
	{2,2,2,2,255,2,2},
	{1,1,1,1,1,255,0}
};
int Getloc(char achar) {
	switch (achar) {
	case ‘+‘:
		return 0;
	case ‘-‘:
		return 1;
	case ‘*‘:
		return 2;
	case ‘/‘:
		return 3;
	case ‘(‘:
		return 4;
	case ‘)‘:
		return 5;
	case ‘#‘:
		return 6;
	}
	return -1; //会引发异常
}
int domath(int a, char opt, int b) {
	switch (opt) {
	case ‘+‘:
		return a + b;
	case ‘-‘:
		return a - b;
	case ‘*‘:
		return a * b;
	case ‘/‘:
		if (b == 0)
		{
			throw "Division by zero condition!";
		}
		return a / b;
	}
	return -1;
}
char transorder(char top, char c) {
	int x, y;
	y = Getloc(top);
	x = Getloc(c);
	return order[y][x];
}
int main()
{
	stack<char> OPTR;
	stack<int> OPND;
	char c;
	OPTR.push(‘#‘);
	c = getchar();
	BOOL ISNUMBER = FALSE;
	while (c != ‘#‘ || OPTR.top()!=‘#‘) {
		if (c >= ‘0‘ && c <= ‘9‘) {
			if (ISNUMBER) {
				int tmp = OPND.top();
				OPND.pop();
				OPND.push(tmp * 10 + c - ‘0‘);
				c = getchar();
				continue;
			}
			ISNUMBER = TRUE;
			OPND.push(c - ‘0‘);
			c = getchar();
		}
		else {
			ISNUMBER = FALSE;
			switch (transorder(OPTR.top(), c)) {
			case 1:
				OPTR.push(c);
				c = getchar();
				break;
		
			case 0:
				OPTR.pop();
				c = getchar();
				break;

			case 2:
				int a, b;
				char opt = OPTR.top();
				OPTR.pop();
				b = OPND.top();
				OPND.pop();
				a = OPND.top();
				OPND.pop();
				try {
					OPND.push(domath(a,opt,b));
				}
				catch (const char * e) {
					cerr << e << endl;
					return 0;
				}
				break;
			}
		}
	}
	cout << OPND.top();
	return 0;
}

 哎 写的时候把操作数的类型也写成char了 debug半天。。。

以上是关于数据结构--算数表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

Java 计算数学表达式(字符串解析求值工具)

1033. 表达式求值

IntelliJ:求值lambda表达式在调试时引发编译错误

运算符

C语言☀️操作符详解☀️(详细讲解+代码演示+图解)

表达式与运算符