用栈实现算法表达求值的c程序

时间: 2024-04-27 15:17:27 浏览: 9
当使用栈来实现算法表达式求值时,可以按照以下步骤进行: 1. 创建两个栈,一个用于存储操作数,另一个用于存储操作符。 2. 从左到右遍历算法表达式的每个字符。 3. 如果当前字符是数字,则将其转换为操作数,并将其压入操作数栈。 4. 如果当前字符是操作符,则进行以下操作: - 如果操作符栈为空,或者当前操作符的优先级大于栈顶操作符的优先级,则将当前操作符压入操作符栈。 - 否则,从操作数栈中弹出两个操作数,从操作符栈中弹出一个操作符,进行运算,并将结果压入操作数栈。 5. 当遍历完整个表达式后,如果操作符栈不为空,则从操作数栈中弹出两个操作数,从操作符栈中弹出一个操作符,进行运算,并将结果压入操作数栈。 6. 最后,操作数栈中的唯一元素即为表达式的求值结果。 下面是一个用C语言实现的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义栈结构 typedef struct { 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(capacity * sizeof(int)); return stack; } // 判断栈是否为空 int isEmpty(Stack* stack) { return stack->top == -1; } // 判断栈是否已满 int isFull(Stack* stack) { return stack->top == stack->capacity - 1; } // 入栈 void push(Stack* stack, int item) { if (isFull(stack)) { printf("栈已满,无法入栈\n"); return; } stack->array[++stack->top] = item; } // 出栈 int pop(Stack* stack) { if (isEmpty(stack)) { printf("栈为空,无法出栈\n"); return -1; } return stack->array[stack->top--]; } // 获取栈顶元素 int peek(Stack* stack) { if (isEmpty(stack)) { printf("栈为空\n"); return -1; } return stack->array[stack->top]; } // 运算函数 int performOperation(int operand1, int operand2, char operator) { switch (operator) { case '+': return operand1 + operand2; case '-': return operand1 - operand2; case '*': return operand1 * operand2; case '/': return operand1 / operand2; default: printf("无效的操作符\n"); return -1; } } // 表达式求值函数 int evaluateExpression(char* expression) { Stack* operandStack = createStack(strlen(expression)); Stack* operatorStack = createStack(strlen(expression)); for (int i = 0; expression[i] != '\0'; i++) { if (expression[i] >= '0' && expression[i] <= '9') { int operand = 0; while (expression[i] >= '0' && expression[i] <= '9') { operand = operand * 10 + (expression[i] - '0'); i++; } push(operandStack, operand); i--; } else if (expression[i] == '(') { push(operatorStack, expression[i]); } else if (expression[i] == ')') { while (!isEmpty(operatorStack) && peek(operatorStack) != '(') { int operand2 = pop(operandStack); int operand1 = pop(operandStack); char operator = pop(operatorStack); int result = performOperation(operand1, operand2, operator); push(operandStack, result); } if (!isEmpty(operatorStack) && peek(operatorStack) == '(') { pop(operatorStack); } else { printf("表达式括号不匹配\n"); return -1; } } else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { while (!isEmpty(operatorStack) && peek(operatorStack) != '(' && ((expression[i] != '*' && expression[i] != '/') || (peek(operatorStack) != '+' && peek(operatorStack) != '-'))) { int operand2 = pop(operandStack); int operand1 = pop(operandStack); char operator = pop(operatorStack); int result = performOperation(operand1, operand2, operator); push(operandStack, result); } push(operatorStack, expression[i]); } } while (!isEmpty(operatorStack)) { int operand2 = pop(operandStack); int operand1 = pop(operandStack); char operator = pop(operatorStack); int result = performOperation(operand1, operand2, operator); push(operandStack, result); } int finalResult = pop(operandStack); free(operandStack); free(operatorStack); return finalResult; } int main() { char expression[100]; printf("请输入要求值的算法表达式:"); scanf("%s", expression); int result = evaluateExpression(expression); printf("表达式的求值结果为:%d\n", result); return 0; } ```

相关推荐

最新推荐

recommend-type

表达式求值顺序栈实现包括小数点运算(C语言版).docx

实现思路 使用两个栈,stack0用于存储操作数,stack1用于存储操作符 从左往右扫描,遇到操作数入栈stack0 遇到操作符时,如果优先级低于或等于栈顶操作符优先级,则从stack0弹出两个元素进行计算,并压入stack0,...
recommend-type

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

2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的...
recommend-type

C语言程序设计实现二分查找算法

《二分查找算法》 1)将二分查找元素算法分为三个部分输入元素、查找元素、进行判断! 2)如果查找的元素在原始的元素中找不到话可以进行判定是否进行重新输入,查找,可以选择拒绝1 3)输入原始元素使用升序输入,...
recommend-type

基于 Q-M 算法的逻辑代数化简C语言的程序实现报告.docx

基于 Q-M 算法的逻辑化简程序C语言的实现,实现一个能处理十变量及以上的逻辑函数化简工具。附带完整C语言代码。化简原理概述:搜索所有本原蕴含项,然后从这些本原蕴含项中提取出覆盖开状态集合的最小集合
recommend-type

实数FFT算法的设计及其C语言实现

本人结合自己的实际开发经验,研究了实数的FFT算法并给出具体的C语言函数,读者可以直接应用于自己的系统中。
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

MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性

![MATLAB结构体与对象编程:构建面向对象的应用程序,提升代码可维护性和可扩展性](https://picx.zhimg.com/80/v2-8132d9acfebe1c248865e24dc5445720_1440w.webp?source=1def8aca) # 1. MATLAB结构体基础** MATLAB结构体是一种数据结构,用于存储和组织相关数据。它由一系列域组成,每个域都有一个名称和一个值。结构体提供了对数据的灵活访问和管理,使其成为组织和处理复杂数据集的理想选择。 MATLAB中创建结构体非常简单,使用struct函数即可。例如: ```matlab myStruct
recommend-type

详细描述一下STM32F103C8T6怎么与DHT11连接

STM32F103C8T6可以通过单总线协议与DHT11连接。连接步骤如下: 1. 将DHT11的VCC引脚连接到STM32F103C8T6的5V电源引脚; 2. 将DHT11的GND引脚连接到STM32F103C8T6的GND引脚; 3. 将DHT11的DATA引脚连接到STM32F103C8T6的GPIO引脚,可以选择任一GPIO引脚,需要在程序中配置; 4. 在程序中初始化GPIO引脚,将其设为输出模式,并输出高电平,持续至少18ms,以激活DHT11; 5. 将GPIO引脚设为输入模式,等待DHT11响应,DHT11会先输出一个80us的低电平,然后输出一个80us的高电平,
recommend-type

JSBSim Reference Manual

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