c++用栈的思想写四则运算计算器

#include <iostream>
#include<String>
using namespace std;
//数组栈
int num_list[10];
int sys_list[10];
int num_top = -1;
int sys_top = -1;
int result=0;
int p1 = 0;
//数字入栈
void num_push(int num)
{
	num_list[++num_top] = num;
}
//数字出栈
int num_pop()
{
	int item = num_list[num_top];
	num_list[num_top] = 0;
	num_top--;
	return item;
}
//符号入栈
void sys_push(int num)
{
	sys_top++;
	sys_list[sys_top] = num;
}
//符号出栈
int sys_pop()
{
	int item = sys_list[sys_top];
	sys_list[sys_top] = 0;
	sys_top--;
	return item;
}

//判断符号优先级, "(" > "*" = "/" > "+" = "-" > ")" > "="
//读取字符,压入栈中或者出栈
int read(char* p)
{
	int item=0;
	p = p + p1;
	if (*p!= '\n') 
	{
		if (*p == '+')
		{
			item = -7;
		}
		else if (*p == '-') 
		{
			item = -6;
		}
		else if (*p == '*')
		{
			item = -5;
		}
		else if (*p == '/')
		{
			item = -4;
		}
		else if (*p == '(')
		{
			item = -3;
		}
		else if (*p == ')')
		{
			item = -8;
		}
		else if (*p == '=')
		{
			item = -9;
		}
		else if (*p >= 48 && *p <= 57)
		{
			item = *p-48;
		}
	}
	return item;
}
//如何编写一个计算器程序呢?读取表达式,读到数字就存入a栈中,读到符号判断符号优先级是否存入栈中,如果当前读取的符号优先级大于栈中top优先级则直接存入栈中
//如果小于top优先级则从a栈中pop出两个元素与b栈中top符号进行计算,然后将当前符号存入b栈中。如果读取到(左括号,存入栈中并改为)右括号,使得括号内的数据能够被读取
//之后读取到右括号时pop出两个数字与符号top进行计算,并把之前的左括号(现在改为右括号)pop出b数组。
void main() {
	cout << "请输入表达式:";
	char str[30];
	cin >> str;
	bool flag = true;
	while (flag)
	{
		int a = read(str);
		p1++;
		if (a >= 0)//a>=0,a是数字0-9
		{
			num_push(a);
		}
		else if ((a == -7 || a == -6) && a >sys_list[sys_top])//a为加号
		{
			sys_push(a);
		
		}
		else if ((a == -7 || a == -6) && a < sys_list[sys_top])//a为加号
		{
			if (sys_top == -1) {
				sys_push(a);
			}
			else {
				int a1 = num_pop();
				int a2 = num_pop();
				int s1 = sys_pop();
				switch (s1) {
				case -7:
					result = a1 + a2;
					break;
				case -6:
					result = a1 - a2;
					break;
				case -5:
					result = a1 * a2;
					break;
				case -4:
					result = a1 / a2;
					break;
				}
				num_push(result);
				sys_push(a);
			}
		}
		else if ((a == -5 || a == -4) && a > sys_list[sys_top])//a为*号
		{
			
			sys_push(a);
		}
		else if ((a == -5 || a == -4 )&& a  < sys_list[sys_top])//a为*号
		{
			if (sys_top == -1) {
				sys_push(a);
			}
			else {
				int a1 = num_pop();
				int a2 = num_pop();
				int s1 = sys_pop();
				switch (s1) {
				case -7:
					result = a1 + a2;
					break;
				case -6:
					result = a1 - a2;
					break;
				case -5:
					result = a1 * a2;
					break;
				case -4:
					result = a1 / a2;
					break;
				}
				num_push(result);
				sys_push(a);
			}
		}
		else if (a == -3)//a为(号
		{
			sys_push(-8);
		}
		else if (a == -8)//a为)号
		{
			int a1 = num_pop();
			int a2 = num_pop();
			int s1 = sys_pop();
			
			switch (s1) {
			case -7:
				result = a1 + a2;
				break;
			case -6:
				result = a1 - a2;
				break;
			case -5:
				result = a1 * a2;
				break;
			case -4:
				result = a1 / a2;
				break;
			}
			num_push(result);
			sys_pop();
		}
		else if (a == -9)//a为=号
		{
			while (sys_list[0]!=0) {
				int a1 = num_pop();
				int a2 = num_pop();
				int s1 = sys_pop();

				switch (s1) {
				case -7:
					result = a1 + a2;
					break;
				case -6:
					result = a1 - a2;
					break;
				case -5:
					result = a1 * a2;
					break;
				case -4:
					result = a1 / a2;
					break;

				}
				num_push(result);
			}
			flag = false;
			//输出结果
			cout << "结果为:" << result << endl;
			break;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值