数据结构 栈和队列

本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的线性表,主要讨论了栈的概念、操作、存储结构以及在表达式求值中的应用。同时,队列作为另一种线性表,遵循先进先出(FIFO)原则,包括了其定义、存储方式(顺序队列、循环队列和链式队列)以及队列满与队列空的判断方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、栈

1、栈 是仅在表尾进行插入、删除操作的线性表。表尾(即 an 端)称为栈顶 /top ;   表头(即 a1 端)称为栈底/base

例如: 栈 S= (a1  , a2  , a3  , ……….,an-1   ,  an ),a1称为栈底元素,an称为栈顶元素

插入元素到栈顶的操作,称为入栈。从栈顶删除最后一个元素的操作,称为出栈

插入和删除都只能在表的一端(栈顶)进行!

2、堆栈是一种特殊的线性表,它只能在表的一端(即栈顶)进行插入和删除运算。


“进”=插入=压入=PUSH(an+1)  ; “出”=删除=弹出=POP(an)

栈不存在的条件:   base=NULL;
栈为空 的条件 :   base=top;
栈满的条件  :   top-base=stacksize;

 

若入栈动作使地址向高端增长,称为“向上生成”的栈;
若入栈动作使地址向低端增长,称为“向下生成”的栈;
           对于向上生成的堆栈:
入栈口诀:堆栈指针top “先压后加” :   S[top++]=an+1
出栈口诀:堆栈指针top “先减后弹” :    e=S[--top]

顺序栈的存储:

#define     STACK-INIT-SIZE      100  //存储空间初始分配量
  #define     STACKINCREMENT    10   //存储空间分配增量
            typedef    struct{
                            SElemType     *base;    //栈的基址即栈底指针
                            SElemType     *top;     //栈顶指针
                            int               stacksize;  //当前分配的空间
                           }SqStack;

入栈操作:顺序栈入栈函数PUSH(),
status Push(ElemType e) 
{ if(top>M){上溢}
  else s[top++]=e;
}    核心语句:  top=L;


出栈操作:顺序栈出栈函数POP()
status Pop( )
{ if(top=L) { 下溢 }
else { e=s[--top];     return(e);} 
 }


栈的应用:表达式求值: 表达式求值的算法是   “算符优先法”。

一个算术表达式是由操作数(x,y,z…)和 算符(* ,/, + ,-,(,),# )组成.

(1)  表达式求值必须满足算术四则运算规则:         a.  从左算到右         b. 先乘除,后加减         c. 先括号内,后括号外

为了实现算符优先算法,可以设定两个工作栈,OPND—存放操作数或运算结果, OPTR—存放运算符号。

(2) 算法思想:
1)首先置操作数栈OPND为空栈,表达式的起始符#为运算符栈OPTR的栈底元素;
2)依次读入表达式中的每个字符,
若运算符是‘#’或栈顶是‘#’,结束计算,返回OPND栈顶值。
        if(是操作数) →  则PUSH( OPND,操作数);
        if(是运算符) → 则与OPTR栈顶元素进行比较,按优先级进行操作;

3)直到整个表达式求值完毕(当前读入的字符和OPTR栈的栈顶元素均为# )

表达式求值过程描述:3*(7-2)


小结:

栈:是一种只允许在一端进行插入和删除的线性表,它是一种操作受限的线性表。在表中只允许进行插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。栈顶元素总是最后入栈的,因而是最先出栈;栈底元素总是最先入栈的,因而也是最后出栈。因此,栈也被称为“后进先出”的线性表。
栈的顺序存储结构:利用一组地址连续的存储单元依次存放自栈底到栈顶的各个数据元素,称为栈的顺序存储结构。
栈的链式存储结构:栈的链式存储结构就是用一组任意的存储单元(可以是不连续的)存储栈中的数据元素,这种结构的栈简称为链栈。在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点。

二、队列

定义:只允许在表的一端进行插入,而在另一端删除元素的线性表。
在队列中,允许插入的一端叫队尾(rear),允许删除的一端称为队头(front)。特点:先进先出 (FIFO)

顺序队列:用连续的空间区域存放一个队列,设置两个指针分别指向队头合队尾。
循环队列:为解决顺序队列中的溢出现象而设置的头尾连接的队列。
链式队列 :每个元素定义成一个结点,含两个域:其中数据域:存放结点数据,

链队列中,有两个分别指示队头和队尾的指针。链式队列在进队时无队满问题,但有队空问题。

循环队列中,根据等式front= =rear不可以判别队满和队空

仅根据等式front= =rear 无法有效判别是“队满”还是“队空”。
两种常用的方法:
(1)规定:当front= =rear,表示循环队列为空;
当front= =(rear+1)% MAXLEN,表示循环队列为满。
(2)在定义结构体时,附设一个存储循环队列中元素个数的变量n,当n= =0时表示队空;
        当n= =MAXLEN时为队满。

循坏队列的条件:

队头、队尾指针加1,可用取模(余数)运算实现。
队头指针进1:  front = (front+1) %maxsize;
队尾指针进1:  rear = (rear+1) % maxsize;
队列初始化:front = rear = 0;
队空条件:front == rear;
队满条件:(rear+1) % maxsize == front;










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值