栈与队列1

111 阅读1分钟

「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。

栈是限定尽在表尾进行插入和删除操作的线性表,就像杯子一样。 队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表。

允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。

 栈的插入操作,叫进栈,压栈,入栈。
 栈的删除操作,叫出栈,弹栈。

栈本身也是一个线性表,所以对于顺序存储结构和链式存储结构来说,栈一样适用。

栈的结构定义

typedef int SElemType;
typedef struct 
{
    SElemType data[MAXSIZE];
    int top;
}SqStack;

两栈共享空间结构

typedef struct
{
    SElemType data[MAXSIZE];
    int top1;
    int top2;
}SqDoubleStack;

栈的作用---递归

把一个直接调用自己本身或者通过一系列的调用语句间接的调用自己的函数,称作递归函数。 每个递归定义必须至少有一个条件,满足时递归不再进行,即不用引用自身而是返回值退出。 比如我们打印前40位斐波那契数列:

int Fbi(int i)
{
    if(i<2)
        return i == 0 ? 0 : 1;
    return Fbi(i-1)+Fbi(i-2);
}
int main()
{
    int i;
    for(int i = 0;i<40;i++)
        printf("%d",Fbi(i));
    return 0;
}

逆波兰表达式

这是一种不需要括号的后缀表达法,就是把运算量写在前面,运算符写在后面。

image.png

我们正常的表达式称为中缀表达式。

对于栈来说,如果两个箱体的数据类型的栈,可以用数组的两端作栈底来让两个栈共享数据,这样可以使空间最大化。

队列

队列其实就跟火车进隧道一样,是一种先进先出的线性表。

允许插入的一端称为队尾,允许删除的一端称为队头。

循环队列

头尾相接的顺序存储队列。结构如下

typedef int QElemType;
typedef struct
{
    QElemType data[MAXSIZE];
    int front;//头指针
    int rear;//尾指针,若队列不空,指向队尾元素的下一个位置。
}SqQueue;

队列的链式存储结构

队列的链式存储结构,就相当于线性表的单链表,只不过它只能尾进头出而已。

对于队列来说,为避免数组插入和删除需要移动数据,于是引入循环队列,使队头和队尾可以在数组中循环变化。解决了移动数据的时间损耗,使时间复杂度由O(n)->O(1)。