简单计算器C代码的实现思路以及代码

本文介绍了如何用C语言实现中缀表达式计算,关键在于中缀转后缀表达式算法。通过初始化两个栈,处理操作数和运算符,遵循运算符优先级进行计算。详细讲解了代码逻辑,包括数字、空格和运算符的处理,以及如何根据运算符优先级决定压栈或执行运算。最后提供了完整代码示例,强调了输入处理的注意事项。
摘要由CSDN通过智能技术生成

在这里插入图片描述
这个问题的关键在于,中缀表达式的计算顺序与运算符有关,并不是单纯的从左至右的计算。而后缀表达式的计算优先级正好是从左至右,可以将中缀转后缀的逻辑运用在中缀表达式的计算中。

中缀转后缀表达式算法(机算):

  1. 初始化一个栈:由于暂时还不能确定运算顺序的运算符,所以需要从左到右处理各个元素,直到末尾;
  2. 遇到操作数:直接加入后缀表达式;
  3. 遇到界限符:遇到"(“直接入栈,遇到”)",则依次弹出栈内运算符并加入后缀表达式,直到弹出 "(“为止,注意”("不加入后缀表达式;
  4. 遇到运算符;依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到"("或栈空则停止。之后再把当前运算符入栈。

在这里插入图片描述

机器实现中缀表达式计算的算法如下:

  1. 初始化两个栈,操作数栈和运算符栈;
  2. 若扫描到操作数,则压入操作数栈;
  3. 若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(每当弹出一个运算符时,就需要再弹出两个操作栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)。

在这里插入图片描述

理解了上面的两个算法之后,就可以应用到本题中来。

代码解析

根据题目可知,输入的表达式中会出现的字符有这样三种:数字、空格、运算符。
当遇到空格的时候,说明前面要么是数字,要么是运算符;
当遇到一个完整数据的时候,则压入栈中;
当遇到一个运算符的时候,则需要比较当前运算符和运算符栈顶元素的优先级。

分析完毕之后就可以开始写代码了,下面分段介绍代码:

字符数组buf: 用于保存输入的表达式,C风格的字符串;
字符串num: 用于保存数字,数字可能不止一位数,因此用字符串保存;
字符串expr: 用于将字符串数组转换成C++风格的字符串;
操作数栈NumStack: 保存操作数;
运算符栈SignStack: 保存运算符;
map类型priority: 给运算符设置优先级,后续在算法中会根据优先级来判断如何操作,在运算符中加入一个结束符,结束符的优先级设为最低,这样可以保证在遇到结束符之后将前面所有的式子都计算完成。

char buf[300];
int i;
double add_num, sum = 0;
string num = "", expr;
stack<double> NumStack;
stack<char> SignStack;
map<char, int> priority
实现一个简单计算器界面,可以使用各种前端框架,如React、Vue等。下面以React为例: 首先,需要创建一个React组件来表示计算器界面。该组件可以包含一个输入框用来显示计算结果,以及若干个按钮,用来输入数字和运算符。 在组件的state中,需要维护当前输入的数字和运算符,以及计算结果。 当用户点击数字按钮时,可以通过setState方法更新当前输入的数字。当用户点击运算符按钮时,可以将当前输入的数字和运算符进行计算,并更新计算结果和当前输入的数字和运算符。 最后,需要将该组件渲染到页面上。 以下是一个简单计算器组件的代码示例: ```jsx import React, { Component } from 'react'; class Calculator extends Component { state = { currentNumber: '', operator: '', result: 0 }; handleNumberClick = (number) => { this.setState({ currentNumber: this.state.currentNumber + number }); }; handleOperatorClick = (operator) => { const { currentNumber, operator: currOperator, result } = this.state; if (currOperator === '+') { this.setState({ result: result + Number(currentNumber) }); } else if (currOperator === '-') { this.setState({ result: result - Number(currentNumber) }); } else if (currOperator === '*') { this.setState({ result: result * Number(currentNumber) }); } else if (currOperator === '/') { this.setState({ result: result / Number(currentNumber) }); } else { this.setState({ result: Number(currentNumber) }); } this.setState({ currentNumber: '', operator }); }; handleEqualClick = () => { const { currentNumber, operator, result } = this.state; if (operator === '+') { this.setState({ result: result + Number(currentNumber) }); } else if (operator === '-') { this.setState({ result: result - Number(currentNumber) }); } else if (operator === '*') { this.setState({ result: result * Number(currentNumber) }); } else if (operator === '/') { this.setState({ result: result / Number(currentNumber) }); } this.setState({ currentNumber: '', operator: '' }); }; handleClearClick = () => { this.setState({ currentNumber: '', operator: '', result: 0 }); }; render() { const { currentNumber, result } = this.state; return ( <div> <input type="text" value={result} disabled /> <div> <button onClick={() => this.handleNumberClick('1')}>1</button> <button onClick={() => this.handleNumberClick('2')}>2</button> <button onClick={() => this.handleNumberClick('3')}>3</button> <button onClick={() => this.handleOperatorClick('+')}>+</button> </div> <div> <button onClick={() => this.handleNumberClick('4')}>4</button> <button onClick={() => this.handleNumberClick('5')}>5</button> <button onClick={() => this.handleNumberClick('6')}>6</button> <button onClick={() => this.handleOperatorClick('-')}>-</button> </div> <div> <button onClick={() => this.handleNumberClick('7')}>7</button> <button onClick={() => this.handleNumberClick('8')}>8</button> <button onClick={() => this.handleNumberClick('9')}>9</button> <button onClick={() => this.handleOperatorClick('*')}>*</button> </div> <div> <button onClick={() => this.handleClearClick()}>C</button> <button onClick={() => this.handleNumberClick('0')}>0</button> <button onClick={() => this.handleEqualClick()}>=</button> <button onClick={() => this.handleOperatorClick('/')}>/</button> </div> </div> ); } } export default Calculator; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值