一、栈Stack的概念栈是一种操作受限的线性表遵循后进先出LIFO, Last In First Out 原则。所有操作插入、删除、访问只能在 栈顶Top 进行。最后进入栈的元素最先被取出就像一叠盘子后放的盘子先被拿走。二、队列Queue的概念队列是一种操作受限的线性表遵循先进先出FIFOFirst In First Out 原则。只允许在队尾插入在队头删除。最早进入队列的元素最先被取出就像排队买票先来的人先买到票。三、栈和队列的核心区别四、栈和队列C语言实现栈的实现方法#includestdio.h#includestdlib.h#includestdbool.h#defineMAX_SIZE100typedefstruct{intdata[MAX_SIZE];inttop;// 栈顶指针}SeqStack;// 初始化栈voidinitStack(SeqStack*s){s-top-1;}// 判断栈空boolisEmpty(SeqStack*s){returns-top-1;}// 判断栈满boolisFull(SeqStack*s){returns-topMAX_SIZE-1;}// 入栈boolpush(SeqStack*s,intvalue){if(isFull(s)){printf(栈满无法入栈\n);returnfalse;}s-data[(s-top)]value;returntrue;}// 出栈boolpop(SeqStack*s,int*value){if(isEmpty(s)){printf(栈空无法出栈\n);returnfalse;}*values-data[(s-top)--];returntrue;}// 获取栈顶元素boolgetTop(SeqStack*s,int*value){if(isEmpty(s)){returnfalse;}*values-data[s-top];returntrue;}// 打印栈voidprintStack(SeqStack*s){if(isEmpty(s)){printf(栈为空\n);return;}printf(栈底 - );for(inti0;is-top;i){printf(%d ,s-data[i]);}printf(- 栈顶\n);}队列的实现方法#defineQUEUE_SIZE100typedefstruct{intdata[QUEUE_SIZE];intfront;// 队头指针intrear;// 队尾指针}SeqQueue;// 初始化队列voidinitQueue(SeqQueue*q){q-frontq-rear0;}// 判断队空boolisQueueEmpty(SeqQueue*q){returnq-frontq-rear;}// 判断队满牺牲一个单元boolisQueueFull(SeqQueue*q){return(q-rear1)%QUEUE_SIZEq-front;}// 入队boolenQueue(SeqQueue*q,intvalue){if(isQueueFull(q)){printf(队列满\n);returnfalse;}q-data[q-rear]value;q-rear(q-rear1)%QUEUE_SIZE;returntrue;}// 出队booldeQueue(SeqQueue*q,int*value){if(isQueueEmpty(q)){printf(队列空\n);returnfalse;}*valueq-data[q-front];q-front(q-front1)%QUEUE_SIZE;returntrue;}// 获取队头元素boolgetFront(SeqQueue*q,int*value){if(isQueueEmpty(q))returnfalse;*valueq-data[q-front];returntrue;}// 获取队列长度intgetQueueLength(SeqQueue*q){return(q-rear-q-frontQUEUE_SIZE)%QUEUE_SIZE;}
【入门级-数据结构-1、线性结构:栈和队列】
一、栈Stack的概念栈是一种操作受限的线性表遵循后进先出LIFO, Last In First Out 原则。所有操作插入、删除、访问只能在 栈顶Top 进行。最后进入栈的元素最先被取出就像一叠盘子后放的盘子先被拿走。二、队列Queue的概念队列是一种操作受限的线性表遵循先进先出FIFOFirst In First Out 原则。只允许在队尾插入在队头删除。最早进入队列的元素最先被取出就像排队买票先来的人先买到票。三、栈和队列的核心区别四、栈和队列C语言实现栈的实现方法#includestdio.h#includestdlib.h#includestdbool.h#defineMAX_SIZE100typedefstruct{intdata[MAX_SIZE];inttop;// 栈顶指针}SeqStack;// 初始化栈voidinitStack(SeqStack*s){s-top-1;}// 判断栈空boolisEmpty(SeqStack*s){returns-top-1;}// 判断栈满boolisFull(SeqStack*s){returns-topMAX_SIZE-1;}// 入栈boolpush(SeqStack*s,intvalue){if(isFull(s)){printf(栈满无法入栈\n);returnfalse;}s-data[(s-top)]value;returntrue;}// 出栈boolpop(SeqStack*s,int*value){if(isEmpty(s)){printf(栈空无法出栈\n);returnfalse;}*values-data[(s-top)--];returntrue;}// 获取栈顶元素boolgetTop(SeqStack*s,int*value){if(isEmpty(s)){returnfalse;}*values-data[s-top];returntrue;}// 打印栈voidprintStack(SeqStack*s){if(isEmpty(s)){printf(栈为空\n);return;}printf(栈底 - );for(inti0;is-top;i){printf(%d ,s-data[i]);}printf(- 栈顶\n);}队列的实现方法#defineQUEUE_SIZE100typedefstruct{intdata[QUEUE_SIZE];intfront;// 队头指针intrear;// 队尾指针}SeqQueue;// 初始化队列voidinitQueue(SeqQueue*q){q-frontq-rear0;}// 判断队空boolisQueueEmpty(SeqQueue*q){returnq-frontq-rear;}// 判断队满牺牲一个单元boolisQueueFull(SeqQueue*q){return(q-rear1)%QUEUE_SIZEq-front;}// 入队boolenQueue(SeqQueue*q,intvalue){if(isQueueFull(q)){printf(队列满\n);returnfalse;}q-data[q-rear]value;q-rear(q-rear1)%QUEUE_SIZE;returntrue;}// 出队booldeQueue(SeqQueue*q,int*value){if(isQueueEmpty(q)){printf(队列空\n);returnfalse;}*valueq-data[q-front];q-front(q-front1)%QUEUE_SIZE;returntrue;}// 获取队头元素boolgetFront(SeqQueue*q,int*value){if(isQueueEmpty(q))returnfalse;*valueq-data[q-front];returntrue;}// 获取队列长度intgetQueueLength(SeqQueue*q){return(q-rear-q-frontQUEUE_SIZE)%QUEUE_SIZE;}