第1关:基于栈的中缀算术表达式求值,用c++编写

时间: 2023-05-25 08:07:15 浏览: 130
#include <stdio.h> #include <stdlib.h> /* 栈结构体 */ typedef struct stack { int top; int capacity; int *array; } Stack; /* 创建栈 */ Stack *createStack(int capacity) { Stack *stack = (Stack *)malloc(sizeof(Stack)); stack->top = -1; stack->capacity = capacity; stack->array = (int *)malloc(stack->capacity * sizeof(int)); return stack; } /* 判断栈是否已满 */ int isFull(Stack *stack) { return stack->top == stack->capacity - 1; } /* 判断栈是否为空 */ int isEmpty(Stack *stack) { return stack->top == -1; } /* 压栈 */ void push(Stack *stack, int item) { if (isFull(stack)) { printf("Stack is full\n"); return; } stack->array[++stack->top] = item; } /* 出栈 */ int pop(Stack *stack) { if (isEmpty(stack)) { printf("Stack is empty\n"); return -1; } return stack->array[stack->top--]; } /* 获取栈顶元素 */ int peek(Stack *stack) { if (isEmpty(stack)) return -1; return stack->array[stack->top]; } /* 操作符优先级 */ int precedence(char ch) { switch (ch) { case '+': case '-': return 1; case '*': case '/': return 2; case '^': return 3; default: return -1; } } /* 中缀表达式求值 */ int evaluate(char *exp) { Stack *operands = createStack(strlen(exp)); Stack *operators = createStack(strlen(exp)); for (int i = 0; exp[i]; ++i) { if (exp[i] == ' ') continue; else if (isdigit(exp[i])) { int num = 0; while (isdigit(exp[i])) { num = num * 10 + (exp[i] - '0'); ++i; } --i; push(operands, num); } else if (exp[i] == '(') push(operators, exp[i]); else if (exp[i] == ')') { while (!isEmpty(operators) && peek(operators) != '(') { int op1 = pop(operands); int op2 = pop(operands); char op = pop(operators); switch (op) { case '+': push(operands, op2 + op1); break; case '-': push(operands, op2 - op1); break; case '*': push(operands, op2 * op1); break; case '/': push(operands, op2 / op1); break; case '^': push(operands, pow(op2, op1)); break; } } if (!isEmpty(operators) && peek(operators) == '(') pop(operators); } else { while (!isEmpty(operators) && precedence(exp[i]) <= precedence(peek(operators))) { int op1 = pop(operands); int op2 = pop(operands); char op = pop(operators); switch (op) { case '+': push(operands, op2 + op1); break; case '-': push(operands, op2 - op1); break; case '*': push(operands, op2 * op1); break; case '/': push(operands, op2 / op1); break; case '^': push(operands, pow(op2, op1)); break; } } push(operators, exp[i]); } } while (!isEmpty(operators)) { int op1 = pop(operands); int op2 = pop(operands); char op = pop(operators); switch (op) { case '+': push(operands, op2 + op1); break; case '-': push(operands, op2 - op1); break; case '*': push(operands, op2 * op1); break; case '/': push(operands, op2 / op1); break; case '^': push(operands, pow(op2, op1)); break; } } return pop(operands); } int main() { char exp[] = "3 + 4 * ( 5 - 2 ) ^ 2"; printf("结果为:%d\n", evaluate(exp)); return 0; }

相关推荐

最新推荐

recommend-type

基于栈结构的中缀表达式求值实验报告

基于栈结构的中缀表达式求值 用c语言详细的叙述了如何求栈结构的中缀表达式的值
recommend-type

c语言 实现二叉树操作 用栈实现算术表达式求值

1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值
recommend-type

c++类模板求解中缀算术表达式

1.要求:完成标准中缀算术表达式求值运算。 2.中缀表达式由键盘输入,以回车键结束。如:3*((4+6)-(5-2)^3) 3.输入的中缀表达式符合以下要求: (1) 中缀表达式长度不确定。 (2) 中缀表达式仅出现在一行输入行...
recommend-type

麦肯锡-年月―中国xx集团战略咨询项目建议书.ppt

麦肯锡-年月―中国xx集团战略咨询项目建议书.ppt
recommend-type

廖倩5.14运营款.xlsx

廖倩5.14运营款.xlsx
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。