用栈写一个计算器

本文介绍了如何使用栈数据结构实现一个中缀表达式计算器。通过遍历用户输入的字符串,将数字压入数栈,根据运算符优先级决定是否进行计算或压入符号栈。对于括号,遵循括号运算规则。文章还涵盖了计算类中的关键方法,包括判断运算符和计算优先级。
摘要由CSDN通过智能技术生成

计算器

希望:用户直接输入一个中缀表达式(字符串)给计算机
然后计算机计算出结果。

思路

创建两个栈一个存储数s1,另一个存储运算符号s2,对用户传入的字符串用index进行一个一个遍历。

  1. 如果遍历的数,直接入数栈s1。
    • 因为对字符串遍历是一个一个进行的,当遍历多位数时不能直接入栈,要检验后一位是否为数字,直到后一位是符号才结束遍历
  2. 如果遍历的是符号,若符号栈s2,为空直接入栈
    1.若是左括号“(”直接入栈
    2. 若是遇到右括号“)” ,则从数栈中弹出两个数,符号栈中弹出一个符号进行运算,运算的结果压入数栈,直到遇到左括号“(”,才停止操作,最后弹出“(” –对括号进行消除
    3. 若入栈的符号与栈顶的符号进行,入栈符号运算优先级大于栈顶,直接入栈
    4. 若入栈符号优先级小于或等于栈顶,则数栈弹出两个数,符号栈弹出一个符号进行运算,运算的结果入数栈,最后再把符号入符号栈

    测试程序

public class Test{
   
	public static void main(String[] args){
   
		//new一个计算器
		compute c=new comput();
		//要输入 中缀表达式
		String s="1+2+33";
		//调用方法结束出结果
		int i=s.outcome(s);
	}
}

comput 计算器类

public class comput{
   
	//无参数构造方法
	public comput(){
   }
	
	//计算的方法outcome,参数传入中缀表达式,字符串
	public int outcome(String s){
   
						//创建两个栈,一个是数栈s1,一个是符号栈s2.
						Stack s1=new Stack();
						Stack s2=new Stack();
						//创建一个用来遍历字符串index 
						int index=0;
						//对字符串进行一个一个遍历
						while(index<s.length()-
在C语言中,我们可以利用顺序栈(数组实现)来设计一个简单的四则运算计算器。由于这里是一个文本环境,我会给出核心代码示例,但请注意,为了完整运行这个程序,你需要在实际环境中编,并处理用户输入、错误检查和边界条件。 ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 typedef struct Stack { int top; int data[MAX_SIZE]; } Stack; // 初始化栈 void init(Stack *s) { s->top = -1; } // 判断栈是否为空 int isEmpty(Stack *s) { return (s->top == -1); } // 将元素压入栈 void push(Stack *s, int val) { if (isEmpty(s)) { s->top++; } s->data[s->top] = val; } // 弹出栈顶元素并返回 int pop(Stack *s) { if (isEmpty(s)) { printf("Stack is empty.\n"); return -1; } int temp = s->data[s->top]; s->top--; return temp; } // 简单的四则运算计算函数 int calculate(Stack *s) { int num1 = pop(s); char op = pop(s); // 操作符 int num2 = pop(s); switch (op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': if (num2 != 0) return num1 / num2; else return -1; // 防止除数为零错误 default: printf("Invalid operator.\n"); return -1; } } int main() { Stack calculatorStack; init(&calculatorStack); char input[10]; while (scanf("%s", input) == 1) { if (!isspace(input[0])) { // 输入数字 push(&calculatorStack, atoi(input)); } else { // 输入操作符 int result = calculate(&calculatorStack); if (result != -1) printf("%d\n", result); } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值