栈实现计算器

本文介绍如何用栈来实现一个计算器。思路是建立两个栈,一个存放数字,一个存放运算符。遍历表达式,遇到数字入数栈,遇到符号则根据优先级决定是否运算。多位数处理时,需判断下一位是否为数字,确保正确入栈。
摘要由CSDN通过智能技术生成

思路

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

代码实现

package com.stack;

public class Calculator {

	public static void main(String[] args) {
		// 测试
		String expression = "3+2*6-2";
		ArrayStack2 numStack = new ArrayStack2(20); // 数字栈
		ArrayStack2 operStack = new ArrayStack2(20); // 符号栈
		// 定义相关变量
		int index = 0;// 定义索引
		int num1 = 0, num2 = 0;
		int oper = 0, res = 0;
		char ch = ' ';// 每次扫描得到的char保存到ch
		// 开始循环扫描expression
		while (true) {
			// 依次得到expression的每一个字符
			ch = expression.substring(index, index + 1).charAt(0);
			// 判断ch是什么,做相应
以下是用实现计算器的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef struct { int top; double data[MAX_SIZE]; } Stack; void init(Stack *s) { s->top = -1; } int isEmpty(Stack *s) { return s->top == -1; } int isFull(Stack *s) { return s->top == MAX_SIZE - 1; } int push(Stack *s, double x) { if (isFull(s)) { return 0; } s->top++; s->data[s->top] = x; return 1; } int pop(Stack *s, double *x) { if (isEmpty(s)) { return 0; } *x = s->data[s->top]; s->top--; return 1; } int peek(Stack *s, double *x) { if (isEmpty(s)) { return 0; } *x = s->data[s->top]; return 1; } int calculate(double a, double b, char op, double *result) { switch (op) { case '+': *result = a + b; break; case '-': *result = a - b; break; case '*': *result = a * b; break; case '/': if (b == 0) { return 0; } *result = a / b; break; default: return 0; } return 1; } int main() { Stack s; init(&s); char c; double x, a, b, result; while (scanf("%c", &c) != EOF) { if (c >= '0' && c <= '9') { ungetc(c, stdin); scanf("%lf", &x); push(&s, x); } else if (c == '+' || c == '-' || c == '*' || c == '/') { if (pop(&s, &b) && pop(&s, &a)) { if (calculate(a, b, c, &result)) { push(&s, result); } else { printf("Invalid expression\n"); return 1; } } else { printf("Invalid expression\n"); return 1; } } else if (c == '\n') { if (peek(&s, &result) && isEmpty(&s)) { printf("%.2f\n", result); } else { printf("Invalid expression\n"); return 1; } init(&s); } } return 0; } ``` 该程序通过读入一个字符,如果是数字,则将其转换为浮点数并压入中;如果是运算符,则从中弹出两个数进行相应的运算,并将结果压入中;如果是换行符,则输出元素(即最终结果),并清空。在计算过程中,如果空或元素不够两个,则输出错误信息并退出程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值