定义
栈是限定在表尾进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈,栈又称后进先出的线性表,简称LIFO结构,
栈的抽象数据类型
栈的顺序存储结构
typedef那一行定义了一个指向结构SNode结构类型的指针,变量名为Stack,可以用Stack来引用结构SNode。
至于void Push中的形参名,第一个是指针形参,这个指针是Stack类型的结构指针,第二个形参是准备入栈的一个数。Element是类型名。
里面的内容就是,检查堆栈是否满了,满了就返回,不满就push。
Ptrs是指向结构体的指针, Data是结构体里面的数组,Top是数组下标的值,表示栈顶的位置。
else后边那句的意思就是:把top上移一位,然后再这一位把要压入的数值放到Data中。
top在空栈的时候,他的值是负一,top是0的时候,栈里面有一个值。
黄色部分是堆栈1为空以及堆栈2为空的两种情况。
tag表示选择哪一个堆栈进行操作
至于++以及--,因为两个是相向而行的,堆栈1是增加的,堆栈2是减小的,所以那样去干,另外记得做处理之前,要看看堆栈是否是空的还是满的,还有就是判断堆栈是否满,利用两个top指针相差1即可。
pop就看堆栈1空不空,还有堆栈2空不空。
堆栈的链式存储结构
top应该在链表的 头结点,因为指针是指向下一个节点的,这样进行插入删除操作都方便找到要插入或者删除的结点,如果在尾结点,因为链表是单链表,没办法回头找到前面的结点。
插入操作:
顺序存储结构因为是用一维数组表示的,数组有固定大小,所以要查看堆栈满不满,而链式存储结构,只要内存足够可以一直链接下去,所以不用看满不满,只看空不空即可。
删除操作,并pop那个值:
过程就是把要删除的结点赋值给一个指针,因为要在删除他之后进行内存释放,然后要删除结点指针域的指针赋值给前一个节点的指针域,再把值赋值给一个变量后续返回pop出去,释放那块空间。
当记到减号的时候,减号跟前面的除号比较,优先级比除号低,所以直接输出除号。
递归定义:把一个调用自己或者通过一系列语句间接调用自己的函数称为递归函数。每个递归函数必须至少有一个条件,满足时递归不再进行,不再引用自身而是返回值然后退出。