数据结构中用C语言,利用栈的知识,进行表达式求值,要代码

时间: 2023-10-26 14:04:43 浏览: 41
下面是一个基于栈的表达式求值的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义栈结构体 typedef struct stack { int top; // 栈顶指针 int* data; // 栈数据 } Stack; // 初始化栈 Stack* initStack(int size) { Stack* s = (Stack*)malloc(sizeof(Stack)); s->top = -1; s->data = (int*)malloc(size * sizeof(int)); return s; } // 判断栈是否为空 int isEmpty(Stack* s) { return s->top == -1; } // 入栈 void push(Stack* s, int val) { s->top++; s->data[s->top] = val; } // 出栈 int pop(Stack* s) { int val = s->data[s->top]; s->top--; return val; } // 获取栈顶元素 int peek(Stack* s) { return s->data[s->top]; } // 获取操作符优先级 int getPriority(char op) { if (op == '*' || op == '/') { return 2; } else if (op == '+' || op == '-') { return 1; } else { return 0; } } // 计算表达式 int calculate(int a, int b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; default: return 0; } } // 表达式求值 int evaluate(char* expression) { int len = strlen(expression); Stack* numStack = initStack(len); Stack* opStack = initStack(len); for (int i = 0; i < len; i++) { char ch = expression[i]; if (ch >= '0' && ch <= '9') { int num = ch - '0'; while (i + 1 < len && expression[i + 1] >= '0' && expression[i + 1] <= '9') { num = num * 10 + (expression[i + 1] - '0'); i++; } push(numStack, num); } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { while (!isEmpty(opStack) && getPriority(ch) <= getPriority(peek(opStack))) { int b = pop(numStack); int a = pop(numStack); char op = pop(opStack); push(numStack, calculate(a, b, op)); } push(opStack, ch); } else if (ch == '(') { push(opStack, ch); } else if (ch == ')') { while (peek(opStack) != '(') { int b = pop(numStack); int a = pop(numStack); char op = pop(opStack); push(numStack, calculate(a, b, op)); } pop(opStack); } } while (!isEmpty(opStack)) { int b = pop(numStack); int a = pop(numStack); char op = pop(opStack); push(numStack, calculate(a, b, op)); } int result = pop(numStack); free(numStack->data); free(numStack); free(opStack->data); free(opStack); return result; } int main() { char expression[100]; printf("请输入表达式:"); scanf("%s", expression); printf("表达式的计算结果为:%d\n", evaluate(expression)); return 0; } ``` 这个代码使用两个栈,一个栈用来存储操作数,一个栈用来存储操作符。具体实现过程中,遇到数字则入操作数栈,遇到操作符则与操作符栈顶元素比较优先级,如果大于或等于则将该操作符入栈,否则将操作符栈顶元素出栈,与操作数栈顶的两个元素进行计算,将结果入操作数栈,直到当前操作符可以入栈。如果表达式扫描完毕,操作符栈中还有元素,则依次取出操作符和操作数进行计算,直到操作符栈为空。最终操作数栈中只有一个元素,即为表达式的计算结果。

相关推荐

最新推荐

recommend-type

Vue中用props给data赋初始值遇到的问题解决

主要介绍了Vue中用props给data赋初始值遇到的问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

C++中用栈来判断括号字符串匹配问题的实现方法

主要介绍了C++中用栈来判断括号字符串匹配问题的实现方法,是一个比较实用的算法技巧,包含了关于栈的基本操作,需要的朋友可以参考下
recommend-type

tensorflow实现在函数中用tf.Print输出中间值

今天小编就为大家分享一篇tensorflow实现在函数中用tf.Print输出中间值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

Python中用post、get方式提交数据的方法示例

最近在学习使用Python,发现网上很少提到如何使用post,所以下面这篇文章主要给大家介绍了关于Python中用post、get方式提交数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值...
recommend-type

软件工程之专题九:数据结构知识

顺序栈即栈的顺序存储结构是,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时设指针top指示栈顶元素的当前位置。 栈也可以用链表实现,链式存储结构的栈简称链栈。若同时需两个以上的栈,则最好...
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

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

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