【数据结构】栈(顺序存储、链式存储)



前言

栈(stack)是限定仅在表尾插入和删除操作的线性表。我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表。

栈的插入操作,叫做进栈,也称为压栈、入栈

栈的删除操作,叫做出栈,也称为弹栈

进出栈



栈的顺序存储结构

顺序存储就是用数组来实现的栈,是一种特殊的线性表,可以简称为顺序栈

栈的结构定义如下:

#define MAXSIZE (100) //栈的最大存储数据量

typedef struct STACK
{
   
    int data[MAXSIZE]; //用于存储数据的数组
    int top; //栈顶指针
}SqStack;

进栈操作如下:

(1)检查是否满栈,满栈则退出并返回错误;

(2)栈顶指针top向上移动一位,将要插入的数据赋给栈顶。

typedef enum
{
   
    FALSE = 0,
    TRUE
}bool;

bool Push(SqStack *S, int data)
{
   
    if (S->top == MAXSIZE - 1) //满栈
    {
   
        return FALSE;
    }

    S->top++; //栈顶指针加一
    S->data[S->top] = data; //将数据赋给栈顶
    return TRUE;
}

出栈操作如下:

(1)检查是否为空栈,若是则退出并返回错误;

(2)将栈顶数据赋给*data函数参数的传递是必须要用指针的,C++最好用引用),栈顶指针向下移动一位。

bool Pop(SqStack *S, int *data)
{
   
    if (S->top == -1) //空栈
    {
   
        return FALSE;
    }

    *data = S->data[S->top]; //将栈顶数据赋给data
    S->top--; //栈顶指针减一
    return TRUE;
}

验证一下:

int main(void)
{
   
    SqStack S
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.单选题(共10题,5) 1线性表采用链式存储结构时,其地址( )。A、必须是连续的B、部分地址必须是连续的C、一定是不连续的D、连续与否均可以正确答案: D 2带头结点的单链表head为空的判断条件是( )。A、head=NULLB、head->next=NULLC、head->next=headD、head!=NULL正确答案: B 3将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( )。A、nB、2n-1C、 2nD、n-1正确答案: A 4在一个单链表中,已知q所指结点是p所指结点的前趋结点,若在q和p之间插入s结点,则执行( )。A、 s->next=p->next;p->next=sB、p->next=s->next;s->next=pC、q->next=s;s->next=pD、p->next=s;s->next=q正确答案: C 5向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动( )个元素。A、64B、63C、63.5D、7正确答案: C 插入 n/2 删除 n-1/2 查询 n+1/2 6若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( )存储方式最节省运算时间。A、单链表B、仅有头指针的单循环链表C、双链表D、仅有尾指针的单循环链表正确答案: D 7若长度为n的线性表采用顺序存储结构,在其第个i位置插入一个新元素算法的时间复杂度为( )。A、 O(log2n)B、O(1)C、O(n)D、O(n2) 正确答案: C 8线性表的静态链表存储结构与顺序存储结构相比优点是( )。A、所有的操作算法简单B、便于插入和删除C、便于利用零散的存储空间D、便于随机存取正确答案: B 9在一个单链表中, 若删除 p 所指结点的后续结点, 则执行( )A、s->next=p;p->next=s;B、s->next=p->next;p=s;C、s->next=p->next;p->next=s;D、p->next=s;s->next=p;正确答案: B 10一个线性表第一个元素的存储地址是 100, 每个元素的长度为 2,则第 5 个元素的地址是( )A、110B、108C、100D、120

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值