C语言栈的表达式求值讲解

简介: C语言栈的表达式求值讲解

在C语言中,使用栈实现表达式的求值是一个经典的问题。栈通常用于处理这类问题,因为它能够方便地处理运算符的优先级和结合性。表达式求值的基本思想是利用两个栈,一个用于存储操作数(operand stack),另一个用于存储运算符(operator stack)。

以下是一个简单的示例,展示了如何使用栈进行表达式求值。在这个示例中,我们假设表达式只包含整数、加(+)、减(-)、乘(*)和除(/)运算符,并且运算符的优先级为:乘法和除法高于加法和减法,且从左到右计算。

数据结构定义

首先,我们定义栈的数据结构以及相关的操作函数。

 

#include <stdio.h> 

 

#include <stdlib.h> 

 

#include <string.h> 

 

#include <ctype.h> 

 

 

 

#define MAX_SIZE 100

 

 

 

typedef struct {

 

int top;

 

unsigned capacity;

 

int* array;

 

} Stack;

 

 

 

Stack* createStack(unsigned capacity) {

 

Stack* stack = (Stack*) malloc(sizeof(Stack));

 

if (!stack) return NULL;

 

stack->capacity = capacity;

 

stack->top = -1;

 

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))

 

return;

 

stack->array[++stack->top] = item;

 

}

 

 

 

int pop(Stack* stack) {

 

if (isEmpty(stack))

 

return INT_MIN;

 

return stack->array[stack->top--];

 

}

 

 

 

int peek(Stack* stack) {

 

if (isEmpty(stack))

 

return INT_MIN;

 

return stack->array[stack->top];

 

}

运算符优先级和结合性

我们需要定义运算符的优先级和结合性。这里,我们简单地将运算符的优先级用整数表示,其中乘法和除法的优先级高于加法和减法。

 

int getPrecedence(char op) {

 

switch(op) {

 

case '+':

 

case '-':

 

return 1;

 

case '*':

 

case '/':

 

return 2;

 

default:

 

return -1;

 

}

 

}

表达式求值函数

现在我们实现一个函数,用于解析和求值给定的表达式。

 

int applyOp(int a, int b, char op) {

 

switch(op) {

 

case '+': return a + b;

 

case '-': return a - b;

 

case '*': return a * b;

 

case '/':

 

if (b != 0)

 

return a / b;

 

else {

 

printf("Error! Division by zero.\n");

 

exit(0);

 

}

 

default:

 

return -1;

 

}

 

}

 

 

 

int evaluateExpression(char* exp) {

 

Stack* values = createStack(MAX_SIZE);

 

Stack* ops = createStack(MAX_SIZE);

 

 

 

int i = 0;

 

while (exp[i]) {

 

// 跳过空格

 

if (isspace(exp[i])) {

 

i++;

 

continue;

 

}

 

 

 

// 如果是数字,则压入操作数栈

 

if (isdigit(exp[i])) {

 

int val = 0;

 

// 解析多位数

 

while (isdigit(exp[i])) {

 

val = (val * 10) + (exp[i] - '0');

 

i++;

 

}

 

i--; // 因为for循环也会增加i,所以需要回退一步

 

push(values, val);

 

}

 

// 如果是运算符,则根据优先级进行处理

 

else if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {

 

while (!isEmpty(ops) && getPrecedence(peek(ops)) >= getPrecedence(exp[i])) {

 

int val2 = pop(values);

 

int val1 = pop(values);

 

char op = pop(ops);

 

push(values, applyOp(val1, val2, op));

 

}

 

push

 

目录
相关文章
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
1月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
28 1
|
2月前
|
程序员 C语言
【C语言基础考研向】06运算符与表达式
本文介绍了C语言中的运算符分类、算术运算符及表达式、关系运算符与表达式以及运算符优先级等内容。首先概述了13种运算符类型,接着详细说明了算术运算符的优先级与使用规则,以及关系运算符和表达式的真假值表示,并给出了C语言运算符优先级表。最后附有课后习题帮助巩固理解。
105 10
|
2月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
391 8
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
374 3
|
2月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
3月前
|
C语言
C语言------运算符与表达式
这篇文章是C语言运算符与表达式的实训教程,通过多个示例程序展示了如何使用算术运算符、关系运算符、逻辑运算符以及条件语句来解决实际问题,并介绍了如何通过函数库简化复杂数学运算。
C语言------运算符与表达式
|
5月前
|
C语言
C语言的栈帧
C语言的栈帧
|
5月前
|
C语言 C++
【数据结构】C语言实现:栈(Stack)与队列(Queue)
【数据结构】C语言实现:栈(Stack)与队列(Queue)
|
5月前
数据结构——栈(C语言版)
数据结构——栈(C语言版)
25 0