线性表其实就是一个用来放置数据的空间,而这个空间的放置我们有时候会规定这个数据的放置会以有限的放置方式将放进线性表,放置方式的不同我们给这个线性表的定义也不一样,于是我们这个要讲的是栈和队列
一.栈
首先,这个栈,我们也叫堆栈,是一种特殊的线性表,对其操作限制在表的同一端进行,具有先进后出(后进先出)的特性,于是通过这个特性我们将这样类型的列表称作LIFO(Last In first Out)表或者是FILO(first In Last Out)。
栈顶:允许进行插入和删除操作的一端,通常是top来指示栈顶于元素的位置。
栈底:指不允许进行操作的一端,一般不需要指示。
(1)顺序栈
我们将数据在顺序栈上的顺序存储结构简称顺序栈
顺序栈的初始化及赋值运算
=设计思路=
1.为顺序栈进行赋值分配数组空间,对栈顶指针进行赋值
2.判断栈是否为满,如果栈满,入栈操作无法执行,未满执行入栈,栈顶指针top加一,新元素赋值给栈顶元素,完成返回
3.判断栈是否为空,如果栈空,出栈操作无法执行,未空执行出栈,栈顶指针top减一,新元素赋值给栈指针所指的变量,完成返回
4.编写代码
这个是对这个栈的结构体类型定义
typedef struct
{
datatype data[MAXSIZE];
int top;
}SeqStack;
顺序栈置空栈:首先建立栈空间,然后初始化栈顶指针。
{
SeqStack* s;
s = new SeqStack;
s->top = -1;
return s;
}
运行判断这个栈是不是空栈
//顺序栈判空栈
int Empty_SeqStack(SeqStack* s)
{
if (s->top == -1) return 1;
else return 0;
}
出栈和入栈操作
//顺序栈入栈
int Push_SeqStack(SeqStack* s, datatype x)
{
if (s->top == MAXSIZE - 1) return 0; //栈满不能入栈
else {
s->top++;
s->data[s->top] = x;
return 1;
}
}
//顺序栈出栈
int Pop_SeqStack(SeqStack* s, datatype* x)
{
if (Empty_SeqStack(s)) return 0; //栈空不能出栈
else {
*x = s->data[s->top];
s->top--; return 1; //栈顶元素存入*x,返回
}
}```
二.队列
只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性。
![](https://www.icode9.com/i/l/?n=20&i=blog/2383840/202110/2383840-20211008102053152-77025820.jpg)
typedef int datatype;
typedef struct node //定义链式栈结构
{
datatype data;
struct node* next;
}StackNode, * LinkStack;
=======================设计思路=======================
1.为顺序栈进行赋值分配数组空间,对栈顶指针进行赋值
2.判断栈是否为满,如果栈满,入栈操作无法执行,未满执行入栈,栈顶指针top加一,新元素赋值给栈顶元素,完成返回
3.判断栈是否为空,如果栈空,出栈操作无法执行,未空执行出栈,栈顶指针top减一,新元素赋值给栈指针所指的变量,完成返回
//置空栈
int Init_LinkStack(LinkStack & S)
{
S = NULL; //讲栈指针置空
return 0;
}
//入栈
int Push_LinkStack(LinkStack& top, datatype x)
{
LinkStack p = new StackNode; //生成新的节点
if (!p) return ERROR;
p->data = x;
p->next = top;
top = p;
return 0;
}
//出栈
int Pop_LinkStack(LinkStack& top)
{
LinkStack p = new StackNode;
if (top == NULL) //栈空
return ERROR;
p = top; //用p临时保存栈顶空间,以备释放
top = top->next; //修改栈顶指针
free(p); //释放原栈顶元素的空间
return 0;
}```