软考19-上午题-【数据结构】-线性结构02:栈和队列

栈、队列,都是线性结构

一、栈

1-1、栈的定义

只能通过访问他的一端来实现数据的存储和检索的线性结构。

特点:先进后出

不含数据元素的栈——空栈。

栈的典型应用,递归

1-2、栈的存储结构

1-2-1、栈的顺序存储—顺序栈

可以用数组实现。

(用地址连续的存储单元存放栈中的元素)

int[] arr = new int[10];

要预先定义栈的存储空间,即,栈空间的容量是有限的,所以,入栈的时候,要先判断是否栈满

1-2-2、栈的链式存储—链栈

头指针 = 栈顶指针 

StackNode{
    int data;
    StackNode next;
}

 

1、链栈的基本操作:

①初始化

top = null;

②判空

if(top == null){
    return true;
}else{
    return false;
}

③入栈

node.next = top;
top = node;

④出栈

if(isEmpty()){
    return false;
}
top = top.next;

⑤读栈顶元素

if(isEmpty()){
    return false;
}
return top;

1-3、栈的真题

真题1:

真题2:

真题3:

真题4:

真题5:

真题6:

真题7:

真题8:

二、队列

2-1、队列的定义

允许在表的一端插入元素,表的另一端删除元素的线性表

特点:先进先出

2-2、队列的存储结构

2-2-1、队列的顺序存储—顺序队列

数组实现。

用地址连续的存储单元存放栈中的元素。

1、顺序队列的基本操作:

①初始化

注意:

        此时,队头、队尾指针,指向相同的位置!!!

②判空

if(front == rear){
    return true;
}else{
    return false;
}

③入队

q[rear] = x;
rear++;

注意:

        入队的时候,队尾指针要向后移,指向下一个元素的位置;队头指针不动。

④出队

// 判空
if(isEmpty()){
    return false;
}
front++;

注意:

        出队的时候,队头指针向后移。 

⑤读队头元素

if(isEmpty()){
    return false;
}
return q[front];

2、循环队列

此方式,队列存在一个问题,看似满了,实则没有满

解决方式:循环队列。

此时,判空有问题:

循环队列,满和空的时候,队头、队尾指针都指向相同的位置。

2-2-2、队列的链式存储—链队列

为了便于操作,给链队列添加一个头节点

判空:头指针(对头指针) = 尾指针,且均指向头结点。 

 1、链队列的基本操作

④出队

特殊情况,当链队列中只有一个节点的时候,删除队尾节点,tail队尾指针需要重新定位到队头指针的位置。

注意:

        链队列的入队、出队,不用遍历整个链表。

2、单循环链表

使用单循环链表表示队列

只需要设置尾指针,就能使入队、出队的时间复杂度为O(1)。

2-2-3、双端队列

2-3、队列的真题

 真题1:

 真题2:D

真题3:

真题4:

真题5:

真题6:

真题7:

真题8:

三、栈、队列真题

真题1:

利用两个栈可以模拟一个队列!!!

真题2:

出队列的序列只有一种。 入队和出队序列是一样的。

真题3:

真题4:

真题5:

真题6:

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值