C语言数据结构 | 堆栈顺序、链式存储及表达式求值

简介: 从计算机对表达式求值引入算数表达式在求值时若无优先级,那么从左到右运算就很容易,但算术表达式由两类对象构成一个是一个是+-*/······不同的运算符号优先级也不一样此时运算就比较困难 ,无法判断运算符后一个运算数是否参与这次运算。

目录

前言

表达式

堆栈 (Stack)

栈的顺序存储

栈的链式存储

CreateStack操作

Push操作

pop操作

堆栈应用:表达式求值

步骤

堆栈的其他应用


前言

从计算机对表达式求值引入

算数表达式在求值时若无优先级,那么从左到右运算就很容易,但算术表达式由两类对象构成

一个是运算数:1、2、3、······

一个是运算符号:+-*/······

不同的运算符号优先级也不一样

此时运算就比较困难 ,无法判断运算符后一个运算数是否参与这次运算

image.gif编辑

表达式

中缀表达式:运算符号位于两个运算符之间。如a+b*c-d/e

后缀表达式:运算符号位于两个运算数之后。如abc*+de/-

后缀表达式求值,以下面的式子为例

8 4 / 2 - 4 2 * + = ?

在运算中只需从左往右计算即可

首先出现8 而后4 后面出现 /,即表示8/4=2;紧接着出现了2和-,那么目前出现的数值就是2 2 -=0;此时042*=08,然后最后的+代表0和8相加0+8=8

堆栈:先放进去的后拿出来,后放进去的后拿出来(后入先出 Last In First Out (LIFO))image.gif编辑

堆栈 (Stack)

具有一定操作约束的线性表

只在一端(栈顶,Top)做插入、删除

插入数据:入栈(Push)

删除数据:出栈(Pop)

类型名称:堆栈(Stack)

数据对象集:一个有0个或多个元素的有穷线性表

操作集:长度为MaxSize的堆栈S∈Stack,堆栈元素item ∈ ElementType

Stack CreateStack(int MaxSize)    //生成空堆栈,最大长度为MaxSize
int IsFull(Stack S,int MaxSize)        //判断堆栈S是否已满
void Push(Stack S,ElementType item)    //将元素item压入堆栈
int IsEmpty(Stack S)              //判断堆栈S是否为空
ElementType Pop(Stack S)          //删除并返回栈顶元素

image.gif

栈的顺序存储

栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量组成。

#defube NaxSuze //存储数据元素的最大个数
typedef struct SNode *Stack;
struct SNode{
        ElementType Data[MaxSize];
        int Top;
};

image.gif

栈的链式存储

栈的链式存储结构实际上就是一个单链表,叫做链栈。插入和删除操作只能在链栈的栈顶进行

typedef struct SNode *Stack;
struct SNode{
        ElementType Data;
        struct SNode *Next;
};

image.gif

CreateStack操作

Stack CreateStack()
{        /*构建一个堆栈的头节点,返回指针*/
    Stack S;
    S = (Stack)malloc(sizeof(struct SNode));
    S->Next = NULL;
    return S;
}
int IsEmpty(Stack S)
{                /*判断堆栈s是否为空,若为空返回1,否则返回0*/
    return(S->Next == NULL);
}

image.gif

Push操作

void Push(ElementType item, Stack S)
{        /*将元素item压入堆栈s*/
    struct SNode *TmpCell;
    TmpCell=(struct SNode *)malloc(sizeof(struct SNode));
    TmpCell->Element = item;
    TmpCell->Next = S->Next;
    S->Next = TmpCell;
}

image.gif

pop操作

ElementType Pop(stack S)
{        /*删除并返回堆栈S的栈顶元素*/
    struct SNode *FirstCell;
    ElementType TopElem;
    if(IsEmpty(S)){
        printf("堆栈空");
        return NULL;
}else{
    FirstCell = S->Next;
    S->Next = FirstCell->Next;
    TopElem = FirstCell ->Element;
    free(FirstCell);
    return TopElem;
}

image.gif

堆栈应用:表达式求值

中缀表达式求值

基本策略:将中缀表达式转换为后缀表达式求值

转换后的特点:

    1. 运算数相对顺序不变
    2. 运算符号顺序发生改变
      1. 需要存储“等待中”的运算符号
      2. 要将当前运算符号与“等待中”的最后一个运算符号比较

        image.gif编辑

        步骤

        从头到尾读取中缀表达式的每个对象,对不同对象按不同情况处理。

          • 运算数:直接输出
          • 左括号:压入堆栈
          • 右括号将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出);
          • 运算符
            • 优先级大于栈顶运算符时,则把它压栈;
            • 优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然后将该运算符压栈
              • 若各对象处理完毕,则把堆栈中存留的运算符一并输出

              堆栈的其他应用

              函数调用及递归实现

              深度优先搜索

              回溯算法······

              相关文章
              |
              1天前
              |
              搜索推荐 C语言
              【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
              【C语言/数据结构】排序(归并排序|计数排序|排序算法复杂度)
              8 0
              |
              1天前
              |
              C语言
              【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
              【C语言/数据结构】排序(快速排序及多种优化|递归及非递归版本)
              4 0
              |
              1天前
              |
              C语言
              【C语言/数据结构】排序(选择排序,推排序,冒泡排序)
              【C语言/数据结构】排序(选择排序,推排序,冒泡排序)
              8 0
              |
              1天前
              |
              C语言
              【C语言/数据结构】排序(直接插入排序|希尔排序)
              【C语言/数据结构】排序(直接插入排序|希尔排序)
              9 4
              |
              1天前
              |
              C语言
              【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
              【C语言/数据结构】二叉树(层序遍历|判断完全二叉树|性质)
              261 52
              |
              3天前
              |
              存储 缓存 算法
              【C 言专栏】C 语言中的数据结构应用
              【5月更文挑战第4天】本文探讨了C语言中的核心数据结构,包括数组、链表(单链表和双链表)、栈、队列、二叉树(如二叉搜索树和二叉堆)以及图结构。这些数据结构在程序设计中扮演着关键角色,如数组的快速访问、链表的动态管理、栈和队列的处理流程控制、树和图的复杂关系表示。理解并选择适当的数据结构可优化程序性能,而内存管理和算法优化则进一步提升效率。通过案例分析和展望未来发展趋势,本文旨在帮助读者深化对C语言数据结构的理解和应用。
              【C 言专栏】C 语言中的数据结构应用
              |
              12天前
              |
              存储 算法 C语言
              C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
              C语言进阶:顺序表(数据结构基础) (以通讯录项目为代码练习)
              |
              12天前
              |
              存储 编译器 C语言
              C语言基础知识:数据在内存中的存储解析(整数,浮点数)
              C语言基础知识:数据在内存中的存储解析(整数,浮点数)
              |
              12天前
              |
              C语言
              数据结构中顺序栈的进栈和出栈用C语言表示
              数据结构中顺序栈的进栈和出栈用C语言表示
              18 1
              |
              14天前
              |
              存储 C语言
              C语言动态存储方式与静态存储方式
              C语言动态存储方式与静态存储方式
              8 0