在数组中,我们可以通过索引(下标)随机访问元素。但是,在某些情况下,外面可能需要限制处理顺序,这就产生了栈和队列这两种功能受限的线性结构。
栈(stack)先进后出:LIFO(last in first out)
栈只有一个开口,先进去的就到下面,后进来的就在上面(top),要是拿出去的话,肯定是先从开口段拿出去,所以说
队列(queue)先进先出:FIFO(first in first out)
队列中有队首(front)和队尾(back),队首指向队列的第一个数据,队尾指向队列的最后一个数据。数据从队尾入队,从队首出对。
2.栈和队列的功能实现 1.栈的基本操作:增、删、查、改。栈的结构可以用数组或者链表实现。
1.栈结构的声明typedef int Type;
#define STACK_SIZE 10//栈的最大大小
typedef struct Stack
{
Type data[STACK_SIZE];//栈的数据域
int top;//栈顶元素下标
}stack;
2.栈的初始化
使用malloc动态开辟一个stack大小的内存
初始化栈顶的元素下标
stack* stack_init()
{
stack* temp = (stack*)malloc(sizeof(stack));
assert(temp);//断言(报错)函数(来自断言头文件):
//当函数参数为NULL或者0时会断言(中断程序执行并弹出报错窗口)
temp->top = -1;//初始化栈顶元素下标top值为-1(-1表示栈中没有数据,栈为空)
}
3.栈的创建
见上
4.数据入栈void stack_push(stack* st, Type val)
{
assert(st);//判断栈是否存在
assert(!stack_full(st));//判断栈是否满
st->data[++st->top] = val;//向栈顶插入数据
}
5.数据出栈
数据出栈需要取出栈顶的元素,所以要将元素下标top作自减
Type stack_pop(stack* st)
{
assert(st);//判断栈是否存在
assert(!stack_empty(st));//判断是否空
return st->data[st->top--];//返回栈顶元素
}
6.获取栈顶元素
获取元素但不出栈,和数据出栈的差距是不需要作自减操作
Type stack_top(stack* st)
{
assert(st);//判断栈是否存在
return st->data[st->top];//返回栈顶元素
}
7.判断栈空
int stack_full(stack* st)
{
//if (st->top >= STACK_SIZE - 1);
//return 1;//栈满
//return 0;//栈没满
return st->top >= STACK_SIZE - 1;
}
8.判断栈满
int stack_empty(stack* st)
{
return st->top==-1;//如果栈为空则返回非0值(返回1),否则返回0
}



