一、栈和队列介绍
二、栈结构
1、栈结构介绍
2、栈结构所具备的功能
3、栈结构的顺序表示与实现
4、栈结构的链式表示与实现
5、栈的应用
三、队列
1、队列介绍
2、队列结构所具备的功能
3、队列结构的链式表示与实现
4、顺序队列的表示与实现
带计数器版本的循环队列:
不带计数器版本的循环队列:
5、队列的应用
一、栈和队列介绍
栈和队列是两种重要的线性结构,从数据结构来看,他们也是线性表,其特殊性在于它们的基本操作是线性表的子集,也就中功能受限的线性表,也被称为限定性的数据结构。
但从数据类型角度来看,它们是和线性表不大相同,有些时候它们被当作一种管理数据的规则。
二、栈结构
1、栈结构介绍
栈(stack) 是限定仅在表尾进行插入或删除操作和线性表(只有一端口能进出数据),对栈来说表尾和表头有特殊含义,表尾被称为栈顶,表头被称为栈底,没有元素的空表称为空栈,元素数量达到栈的容量称为满栈,数据添加到栈中叫入栈、压栈,数据从栈中删除叫出栈、弹栈,由于栈元素特殊添加和删除的规则,所以栈的元素会先进后出的现象,简称为LIFO(Last in first out)。
2、栈结构所具备的功能
1、创建栈
2、销毁栈
3、栈是否为空
4、栈是否为满
5、入栈
6、出栈
8、查看栈顶元素
9、栈元素数量
注:只有顺序栈结构才有需要判断栈是否满。
3、栈结构的顺序表示与实现
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define TYPE int typedef struct StackArray { TYPE* base; int top; size_t cap; }StackArray; // 创建栈 StackArray* create_stack(size_t cap) { // 之所以使用成员指针是为了兼顾笔试题 StackArray* stack = malloc(sizeof(StackArray)); stack->base = malloc(sizeof(TYPE)*cap); stack->cap = cap; // 初始值值决定的栈空、栈满、入栈、查看栈顶时的top的操作, stack->top = -1; return stack; } // 销毁栈 void destroy_stack(StackArray* stack) { free(stack->base); free(stack); } // 判断栈是否为空 bool empty_stack(StackArray* stack) { // 因为top的初始值是-1 return 0 > stack->top; } // 判断栈是否为满 bool full_stack(StackArray* stack) { // 同上 return stack->cap == stack->top+1; } // 入栈 bool push_stack(StackArray* stack,TYPE val) { if(full_stack(stack)) return false; // 同上 stack->base[++stack->top] = val; return true; } // 出栈 bool pop_stack(StackArray* stack) { if(empty_stack(stack)) return false; stack->top--; return true; } // 计算栈元素数量 size_t size_stack(StackArray* stack) { return stack->top+1; } // 查看栈顶 bool top_stack(StackArray* stack,TYPE* ptr) { if(empty_stack(stack)) return false; *ptr = stack->base[stack->top]; return true; } int main(int argc,const char* argv[]) { int num; StackArray* stack = create_stack(10); for(int i=0; i<10; i++) { push_stack(stack,i); if(top_stack(stack,&num)) printf("top %d\n",num); } printf("----------------------\n"); while(!empty_stack(stack)) { top_stack(stack,&num); printf("top %d\n",num); pop_stack(stack);