用C语言中栈的思想实现加减乘除四则运算和括号的计算器

设计思路

将每个运算符设置优先级,运用栈先入后出的思想,从左到右扫描输入到电脑上的计算公式,将扫描到的数字数据和字符数据的优先级分别存入两个数组,再依次从两个数组中弹出对应的数据和计算符号进行计算。

主要问题

1.如何让计算机实现正确的符号计算顺序?
为每个符号设定相应的优先级,在这个程序中我将+,-优先级设置为1,*,/设置为2,(设置为3,)设置为0,=设置为-1,也就是最低等。
在从左到右扫描代数式时,若下一位符号优先级更大,则改符号可以直接推入存储符号的栈中;若下一位符号优先级相比较小,则在数字栈弹出两个数字,在符号位弹出一个符号进行运算。

符号| 序号 | 优先级 |
+| -7 | 1 |
–| -6 | 1 |
x | -5 | 2 |
/ | -4 | 2 |
( | -3 | 3 |
) | -2 | 0 |
=| -1 | -1|

2.如何实现多位数的扫描?
设置rate变量,正常情况下rate为10,前面扫描得到的数据在下一次扫描时乘上10再加上后面扫描的数据,若遇到小数点的情况则rate变为0.1,且之后的每次扫描rate都应该缩小10倍

3.如何实现括号位的计算?
当遇到左括号时,因为左括号的优先级大于任何一个运算符,所以左括号可以直接压入栈中,在压入栈中之后将左括号运算符改为右括号运算符,为了让括号内的运算符也可以成功压入栈栈中。
遇到右括号运算符时,右括号运算符只比等号运算符优先级大,所以读取到右括号运算符后计算机会开始计算括号内的式子,计算完括号内的式子后直接将左括号运算符从栈内弹出。

数据结构和主要函数

Struct fuhao s[7]运用结构存放不同的操作符和对应的优先级;
Char str[30]用来存放输入的算式;
double a[20]用来存放运算的数据;
int b[20]用来存放操作符号所对应的在结构数组中的编号;

Void PUSH(nu,a[])为将操作数存放进数组a中;
void PUSH1(nu,b[])为将操作符号对应的序号存放进数组b中;
Double READ(*p)为读取字符串的数据,返回读取的数据;
Double POP(a[])为弹出a数组顶部的操作数,返回操作数;
int POP1(b[])为弹出b数组顶部的操作符对应序号;
Int t 用来判断情况,double ans为计算后的最终结果;

代码实现

#include <iostream>
using namespace std;
int lu=0;
struct fuhao
{
   
   
	char f;
	int x;
}s[7]={
   
   {
   
   '+',1},{
   
   '-',1},{
   
   'x',2},{
   
   '/',2},{
   
   '(',3},{
   
   ')',0},{
   
   '=',-1}};
void PUSH(double nu,double a[])
{
   
   
	int i=0;
	for(;i<=20;i++)
		if(a[i]==9999)
			break;
	a[i]=nu;
}//常数入栈
void PUSH1(double nu,int b[])
{
   
   
	int i=0;
	for(;i<=20;i++)
		if(b[i]==9999)
			break;
	b[i]=nu;
}//符号优先级入栈
double READ(char *p)//从左往右读取
{
   
   
	double rate=10.0,item=0;
	int x=0;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值