栈实现计算器—思路分析及代码实现

《python算法与数据结构2000讲》0227. 基本计算器 II 阅读详情

栈实现计算器思路分析

创建两个栈,一个存放数一个存放运算符。
在这里插入图片描述

  1. 通过一个index值(索引),来遍历我们的表达式
  2. 如果发现是一个数字,就直接入数栈
  3. 如果发现扫描到是一个符号,就分如下情况:
    (1)如果发现当前的符号栈为空,就直接入栈.
    (2)如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前的操作符入符号栈,如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。
  4. 当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行。
  5. 最后在数栈只有一个数字,就是表达式的结果。
    验证:3+2*6-2=13

代码实现

在这里插入图片描述

package com.stack;

public class Calculator {

	public static void main(String[] args) {
		// 表达式运算
		String expression = "70+2*6-4";
		// 创建两个栈,数栈,符号栈
		ArrayStack2 numStack = new ArrayStack2(10);
		ArrayStack2 operStack = new ArrayStack2(10);
		// 定义相关变量
		int index = 0;// 用于扫描
		int num1 = 0;
		int num2 = 0;
		int oper = 0;
		int res = 0;
		char ch = ' ';// 将每次扫描到的char保存到ch
		String keepNum = "";// 用于拼接多位数
		// 开始扫描 expression
		while (true) {
			// 依次得到expression的每一个字符
			ch = expression.substring(index, index + 1).charAt(0);
			// 判断ch是什么,然后作相应处理
			if (operStack.isOper(ch)) {
				// 判断当前的符号栈是否为空
				if (!operStack.isEmpty()) {

					if (operStack.priority(ch) <= operStack.priority(operStack.peek())) {
						num1 = numStack.pop();
						num2 = numStack.pop();
						oper = operStack.pop();
						res = numStack.cal(num1, num2, oper);
						// 把运算的结果入数栈
						numStack.push(res);
						// 操作符入符号栈
						operStack.push(ch);
					} else {
						// 如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈
						operStack.push(ch);
					}
				} else {
					// 如果为空直接入符号栈
					operStack.push(ch);
				}
			} else {
				// 数字直接入栈
				// numStack.push(ch - 48);//只可以处理一位数
				// 处理多位数
				keepNum += ch;
				// 如果ch已经是expression的最后一位,就直接入栈
				if (index == expression.length() - 1) {
					numStack.push(Integer.parseInt(keepNum));
				} else {
					// 判断下一位是否为数字
					if (operStack.isOper(expression.substring(index + 1, index + 2).charAt(0))) {
						// 如果是运算符,则入栈
						numStack.push(Integer.parseInt(keepNum));
						// 重要!!!!!!清空keepNum
						keepNum = "";
					}
				}
			}
			// index+1判断是否扫描到expression最后
			index++;
			if (index >= expression.length()) {
				break;
			}
		}

		// 当表达式扫描完毕,就顺序的从数栈和符号栈中pop出相应的数和符号,并运行。
		while (true) {
			// 如果符号栈为空,则计算到最后结果。
			if (operStack.isEmpty()) {
				break;
			}
			num1 = numStack.pop();
			num2 = numStack.pop();
			oper = operStack.pop();
			res = numStack.cal(num1, num2, oper);
			numStack.push(res);// 入栈
		}
		// 输出结果
		System.out.printf("表达式:%s=%d", expression, numStack.pop());
	}
}

// 创建一个栈
// 定义一个ArrayStack表示栈,需要扩展功能,
class ArrayStack2 {
	private int maxSize;// 栈的大小
	private int[] stack;// 数组,数组模拟栈
	private int top = -1;// top表示栈顶,初始化为-1
	// 构造器
	public ArrayStack2(int maxSize) {
		this.maxSize = maxSize;
		stack = new int[this.maxSize];
	}
	// 返回当前栈顶的值,但是没有pop出来
	public int peek() {
		return stack[top];
	}
	// 栈满
	public boolean isFull() {
		return top == maxSize - 1;
	}
	// 栈空
	public boolean isEmpty() {
		return top == -1;
	}
	// 进栈push
	public void push(int value) {
		// 判断栈是否满
		if (isFull()) {
			System.out.println("栈满");
			return;
		}
		top++;
		stack[top] = value;
	}
	// 出栈pop
	public int pop() {
		// 判断栈是否为空
		if (isEmpty()) {
			throw new RuntimeException("栈空,没有数据");
		}
		int value = stack[top];
		top--;
		return value;
	}
	// 遍历栈
	public void list() {
		if (isEmpty()) {
			System.out.println("栈空,没有数据");
			return;
		}
		// 从栈顶开始显示数据
		for (int i = top; i >= 0; i--) {
			System.out.printf("stack[%d]=%d\n", i, stack[i]);
		}
	}
	// 返回运算符的优先级,优先级是由程序员来定的,
	// 用数字来表示,数字越大则优先级越高。
	public int priority(int oper) {
		if (oper == '*' || oper == '/') {
			return 1;
		} else if (oper == '+' || oper == '-') {
			return 0;
		} else {
			return -1;
		}
	}
	// 判断是不是运算符
	public boolean isOper(char val) {
		return val == '+' || val == '-' || val == '*' || val == '/';
	}
	// 计算方法
	public int cal(int num1, int num2, int oper) {
		int res = 0;// 存放结果
		switch (oper) {
		case '+':
			res = num1 + num2;
			break;
		case '-':
			res = num2 - num1;// 注意顺序
			break;
		case '*':
			res = num1 * num2;
			break;
		case '/':
			res = num2 / num1;// 注意顺序
			break;
		default:
			break;
		}
		return res;
	}
}
PCL CSF布料模拟算法【2026最新版】 CSF布料模拟地面滤波算法的PCL实现,博客长期更新,本文最近更新时间为:2026年10月26日。 阅读详情

相关推荐

Windows10开机无限蓝屏(SrtTrail.txt)

这个问题已经有很多的大佬发过解决办法了,这里仅仅作为自己日后方便查找所写文章 无法开机——自动修复失败,报SrtTrail.txt文件错误,且陷入无限蓝屏的循环 事故 故事的起因是这样的: 开开心心的组装电脑,花了几天时间来配置,然后发现USB3.0的接口太少,于是在某宝上搞到一张pcie转7口USB3.0的转接卡,往电脑上一插 插电,开机,电流轻松跑上去 然后,它和原来的磁盘阵列卡冲突,跳过阵列卡自检直接进入系统,boom,就导致了这场悲剧 解决方法 在蓝屏的界面找到:疑难解答->通过命令提示符 使

Holo__的博客 3万+

(数据结构)栈

栈,是一种线性存储结构。 特点:1.栈中数据是按照“后进先出”的顺序进出栈的。             2.向栈中添加/删除数据时,只能从栈顶进行操作。 栈通常包括三种操作:push、peek、pop push:向栈中添加元素。 peek:返回栈顶元素。 pop:返回并删除栈顶元素的操作。   栈的c语言实现:数组实现的栈,并且只能存储int数据。 #include &lt;s...

niuyuce的博客 477

使用栈实现简单计算器

描述: 输入一串字符串,输出它的计算结果。//考虑输入不正确的情况 例如输入:722-5+1-5+3-4 输出18 代码如下: public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); Stack<Character> stack2 = new Stack<>();

Little Big Us的博客 1486

阻抗匹配与史密斯(Smith)圆图

在找到点B和B'后,我们就能够测量A'到B和B'到D的弧长,前者就是C的归一化电纳值,后者为L的归一化电抗值。当然,表面上看新的点好像是一个不同的阻抗,实际上Z和1/Y表示的是同一个元件(这个新值在圆图上呈现为一个不同的点,而且反射系数也不相同,依次类推)。出现这种情况的原因是我们的图形本身是一个阻抗图,而新的点代表的是一个导纳。这个方程是在复平面(Γr, Γi)上、圆的参数方程(x - a)² + (y - b)² = R²,它以[r/(r + 1), 0]为圆心,半径为1/(1 + r)。

qq_55759599的博客 3961

手持式激光测距仪全套方案

激光测距全套方案,包括原理图、源代码、PCB、BOM、光学部分资料,结构、特殊元件数据手册及供应商联系方式,提供调试技术文档。全套方案已成功打板验证,实现0.05~50m测量范围,精度在+/—1.5mm,激光波长635~650nm,功率《1mW。方案预留了TTL串口、RS485接口,可通过串口助手看到测量数据,可自行DIY或者商业开发。无论是电路小白,还是技术大拿,都能通过方案资料成功做出一套激光测距仪。

Laser01的博客 2055

利用栈实现简易计算器(含代码)

思路: 计算器的简单实现 实现计算机的加、减、乘、除操作 eg:3+2*4-20/4 = 3+8-5 = 6 1.定义index对表达式进行扫描; 创建两个栈,一个栈存放数字,称为数栈(numStack);一个栈存放符号,称为符号栈(symbolStack); 2.当遇到数字时,入数栈;(注意字符位数,数字有可能是多位数) 2.1若是字符串最后一个的时候,直接入数栈 2.2若不是最后一个字符,需要再往后判断一位,若后一位不是符号,继续遍历,并将该字符拼接;若是则...

Angety 的博客 4303

【软件使用】Calibre部分提参的实用技巧与常见问题解析

本文深入解析Calibre部分提参功能的实用技巧与常见问题,重点介绍hcell和xcell文件的配置方法、PEX命令的进阶使用技巧,以及时钟失真等典型问题的排查指南。通过精准控制寄生参数提取范围,显著提升复杂芯片设计的效率与准确性。

weixin_30836759的博客 116

【C++数据结构】栈实现简单计算器(类模板)

栈的重要应用之一是表达式求值。本文以简单算术表达式为例展现这一应用。

2301_80937868的博客 4101

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 615

Python基础教程——制作简单计算器(完整版,附源码)

程序运行后,将会弹出一个计算器窗口,用户可以通过该窗口进行数字和运算符的输入,计算结果将会显示在文本框中。这里我们使用了全局变量来存储用户输入的数字和运算符,以及计算结果。2. 数据类型:我们需要定义一些变量和数据类型来存储用户输入的数字和运算符,以及计算结果。在计算器中,我们需要定义一些变量和数据类型来存储用户输入的数字和运算符,以及计算结果。3. 运算逻辑:计算器需要根据用户输入的运算符来进行相应的数学运算,并输出计算结果。在计算器中,我们需要根据用户输入的运算符来进行相应的数学运算,并输出计算结果。

2301_78217634的博客 3万+

华为ONU远程登录管理配置

华为P602E、EG8040CONU、EG8240H5、W626E等ONU、ONT默认无法配置管理IP,无法远程telnet登录管理。校园网项目中因故障诊断需要远程登录ONU可以通过OLT的远程WEB代理功能链接登录,具体配置如下:

symstandsun的博客 6108

语义分析代码实现_栈实现综合计算器思路分析及代码实现

## 使用栈完成计算一个表达式的结果7*2*2-5+1-5+3-4使用两个栈1.数栈2.符号栈## 思路分析1.通过一个index值,来遍历我们的表达式2.如果我们发现是一个数字,就直接入数栈3.如果发现扫描的是一个符号,就分情况​ (1)如果发现当前符号栈为空就直接入栈「优先级大于也直接入栈」​ (2)如果有操作符,就进行比较,如何当前的操作符的优先级小于或者等于栈中的操作符,就需要从数栈中po...

weixin_39550379的博客 220

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构与算法之栈

栈实现综合计算器(中缀表达式) 1.使用栈来实现综合计算器 2.思路分析 3.代码实现(先实现一位运算) //主函数 public class Calculatordemo { public static void main(String[] args) { //数栈 ArrayStack2 numStack = new ArrayStack2(50); //符号栈 ArrayStack2 operStack = new Array

qq_42964601的博客 121

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【面试经典 150 | 栈】基本计算器

【面试经典 150 | 栈】基本计算器 +【栈】.

weixin_54383080的博客 1544

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数据结构【栈】栈的基本概述以及综合计算器的实现

1 栈的概述以及基本代码实现 栈(Stack)是一种先入后出的有序列表,先进入的元素总是存在于栈底。删除和加入新元素都是在栈顶进行操作的 简单的代码实现如下,主要就是一个固定大小的数组stack(这里假设是专门放整数的数组),一个栈顶指针top class ArrayStack{ private int maxSize; private int[] stack; private int t...

ligen1112的博客 427

算法训练之栈

算法题目练习——栈

2401_82924480的博客 1010

利用栈实现一个简易计算器(Java实现)

利用栈实现一个简易计算器(Java实现) 一、思路分析 当我们输入一个类似于“7*2+100-5+3-4/2”的简单中缀表达式时,我们的编译器能够利用我们所编写的代码将这个表达式扫描并计算出其结果 在这个表达式中主要有两种元素,一种是数字,一种是符号,那么我们就需要创建两个栈结构存储数据 数栈numStack:存放数 符号栈operStack:存放运算符 1、首先我们需要定义一个index(索引),来遍历我们的表达式 2、如果扫描到一个数字,就直接入数栈 3、如果扫描到一个运算符,那就要分以下几种情况:

好汤圆的博客 1214

栈算法篇——LIFO后进先出,数据与思想的层叠乐章(下)

上篇我们介绍了栈算法的基本原理和应用,本题将结合进阶题目进行讲解。进一步深化对于栈算法的理解运用。在信息的海洋中,栈是一叶扁舟,承载着计算的重量,也承载着思想的深邃。它的操作简单而纯粹,却蕴含着无限的可能性。或许,这正是栈的魅力所在——在有限中追寻无限,在简单中窥见复杂。在这座无形的山峰上,我们每一步都通向更高的远方。

2303_81060385的博客 1681

LeetCode第224题_基本计算器

LeetCode 第224题要求实现一个基本计算器,支持加减运算和括号表达式。解题思路包括使用栈和递归或栈与符号的方法。通过维护当前结果、操作数和符号,遍历字符串处理数字、加减号和括号。遇到左括号时,将当前结果和符号压入栈中;遇到右括号时,弹出栈中的符号和结果进行计算。最终,将最后一个数字加入结果。代码实现展示了C#、Python和C++的解决方案,时间复杂度为O(n),空间复杂度为O(n)。

qq_40263592的博客 1315

HDU-1237-题解-STL、栈

HDU 1237 题解 简单计算器 题目大意 计算器,非负整数 加减乘除 Time: 1000 ms Memory: 32768 kB 解题思路及分析 由于乘除的优先级比加法高,所以在计算的时候要先算乘除 没有括号,乘除算的只是与相邻数字运算的结果 用栈来维护,只算加法,减法则把相反数入栈 乘除即取出栈顶,计算过后再入栈 输入有些复杂,注意结束输入的条件否则容易WA AC代码 #include <bits/stdc++.h> using namespace std; int m.

CapriceH的博客 312

数据结构-栈(二)综合计算器(Java)

1.综合计算器实现思路分析 本文的综合计算器包含的运算符有+,-,*,/ 完成一个综合计算器需要考虑到一个多项式中各个符号的优先级,如果不考虑运算符的优先级就会出现错误的答案,所以在获取多项式的各个项的时候需要对拿到的符号进行判断。 数据结构的选择: 栈,利用栈的特性,可以有顺序的倒序取出数据 使用两个栈放不同类型的数据,stack1(数字栈),stack(符号栈) 1.1 如何对不同优先级的...

weixin_43265151的博客 363

Leetcode224 -- 基本计算器及其拓展

先说一下和Leetcode224的区别,就是多了*/这两个符号,并且*/个加减不属于一个级别,*/优先于+-,所以这里扯到了优先级的概念,并且还有(),为了保证括号内的表达式先被计算,我们定义( 的优先级是最低的,这样定义了优先级之后,就很清晰了。其实这个计算器的实现并不难,因为除了括号就剩下加减法嘛,括号肯定比加减法先执行,但是加减法是同级的,只是会改变数字的正负号而已,所以实现的逻辑并不是很难,我们只需要一个栈,来保存当前的符号sign即可.2.遇到优先级,与最近加入的优先级做对比,

weixin_73618012的博客 566

Leetcode小白试炼(20201211 基本计算器)

文章目录一、题目1. 题目描述2. 示例3. 题目解析二、个人解法1. 解法分析2. 失败反思三、官网高星解法1. 单栈递归法(1)解法分析(2)代码(3)算法分析(4)提交截图2. 后缀表达式 一、题目 1. 题目描述 实现一个基本的计算器来计算一个简单的字符串表达式的值。 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。 说明: 你可以假设所给定的表达式都是有效的。 请不要使用内置的库函数 eval。 2. 示例 示例1: 输入: “1 + 1” 输出: 2 示例

maruijiego 335

【LeetCode】224. 基本计算器

这是一个典型的表达式求值问题,可以通过栈和递归来解决。处理括号的优先级正确处理负数处理空格和非法输入确保计算结果在32位整数范围内。

步子哥的博客 1333
上一篇: 数组模拟栈思路分析及代码实现
下一篇: 中缀表达式转后缀表达式思路分析及代码实现
lu_long
博客等级 码龄8年 11粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值