栈的应用-实现简单计算器

实现简单计算器

思路:输入的为中缀表达式,计算机不利于计算

  1. 将中缀表达式转换为后缀表达式
  2. 对后缀表达式用栈模拟计算过程
#pragma warning(diable:4996)
#include<iostream>
#include<stack>
#include<queue>
#include<string>
#include<map>
using namespace std;

//定义字符结构
struct node
{
	double num;
	char op;
	bool flag;
};
//运算符栈
stack<node> oper;
//存储后缀表达式的队列
queue<node> q;
//记录运算符优先级的关系
map<char, int> op;


//中缀表达式变为后缀表达式
void change(string &str)
{
	node temp;
	for (int i = 0; i < str.length();)
	{
		if (str[i] >= '0' && str[i] <= '9')
		{
			temp.num = 0;
			temp.flag = true;
			while (i < str.length()&&str[i] >= '0' && str[i] <= '9')
			{
				temp.num = temp.num * 10 + int(str[i]-'0');
				i++;
			}
			q.push(temp);
		}
		else
		{
			temp.flag = false;
			temp.op = str[i];
			while(!oper.empty() && (op[str[i]] <= op[oper.top().op]))
			{
				q.push(oper.top());
				oper.pop();
			}
			oper.push(temp);
			i++;

		}
	}
	while (!oper.empty())
	{
		q.push(oper.top());
		oper.pop();
	}

}
//计算后缀表达式
double cal()
{
	while (!q.empty())
	{
		if (q.front().flag == true)
		{
			oper.push(q.front());
			q.pop();
		}
		else
		{
			char op = q.front().op;
			q.pop();
			double num1 = oper.top().num;
			oper.pop();
			double num2 = oper.top().num;
			oper.pop();
			node result;
			result.flag = true;
			if (op == '+') result.num = num1 + num2;
			else if (op == '-') result.num = num2 - num1;
			else if (op == '*') result.num = num1 * num2;
			else if (op == '/') result.num = num2 / num1;
			oper.push(result);
		}
	}
	return oper.top().num;
}


int main()
{
	op['+'] = op['-'] = 0;
	op['*'] = op['/'] = 1;
	while (!oper.empty())
	{
		oper.pop();
	}
	string str;
	getline(cin, str);
	cout << "中缀表达式:" << str << endl;
	change(str);
	//cout << "后缀表达式:" << endl;
	/*while (!q.empty())
	{
		if (q.front().flag == true) cout << q.front().num;
		else cout << q.front().op;
		q.pop();
	}*/
	cout << endl;
	cout << "运算结果:" << cal() << endl;
	system("pause");
	return 0;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经过这学期对数据结构的学习, 我们学习了理论知识, 了解了数据结构设计的思想, 这些知识都为我们的下一步学习打下了坚实的基础。通过课程设计,一方面是为了检查 我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同 时也让我们认清自己的不加以弥补和加强。足之处和薄弱环节,加以弥补和加强。 说起数据结构,它为程序提供了一种思想。计算机本身是无生命的机器,要是计算 机能够运行起来,为人类完成各种各样的工作,就必须让他执行相应的程序,这些程序 都是依靠程序设计语言编写出来的。它是一种思想,在编写程序时可以方便、灵活地运 用。同时,他还向程序员提供了直接操作计算机硬件的功能,具备低级语言的特点,适 合各种类型的软件开发。 说到课程设计,要明确自己的目标。在课设前要明确实训的相关要点,课程设计为 学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结 合起来,锻炼分析解决实际问题的能力。提高适应实际,实践编程的能力。课程设计的 基本理论是该课程设计的 C 语言为基础,掌握程序设计方法,为科学研究中的基层开发 工作奠定良好基础;同时培养学生的分析能力、设计能力和整体设计思想,以提高学生 的科学研究素质和在工作岗位中的具体应用能力。课程设计内容和基本要求,首先课程 设计内容是利用学到的编程知识和编程技巧,通过布置具有一定难度的程序设计题目, 熟悉程序编写,及时查究错误,独立完成。 通过本次课程设计, 自学掌握了随机函数与文件读写的知识, 独立完成了设计任务, 虽然思路和想法还有些不成熟,但是对自己的设计能力有很大的提高,今后仍要更加努 力的深入钻研,是自己的能力有进一步的提高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值