鼓楼做网站公司哪家好,减少网站跳出率,展示图片的网站模板,网站首页作用目录
一、栈
1.栈的概念及结构
1.1栈的概念
1.2栈的结构示意图
2.栈的实现
2.1支持动态增长的栈的结构
2.2压栈#xff08;入栈#xff09;
2.3出栈
2.4支持动态增长的栈的代码实现
二、队列
1.队列的概念及结构
1.1队列的概念
1.2队列的结构示意图
2.队列的实…目录
一、栈
1.栈的概念及结构
1.1栈的概念
1.2栈的结构示意图
2.栈的实现
2.1支持动态增长的栈的结构
2.2压栈入栈
2.3出栈
2.4支持动态增长的栈的代码实现
二、队列
1.队列的概念及结构
1.1队列的概念
1.2队列的结构示意图
2.队列的实现
2.1队列的结构
2.2队尾入队列
2.3队头出队列
2.4队列的代码实现 一、栈
1.栈的概念及结构
1.1栈的概念 栈是一种特殊的线性表。栈只允许在固定的一端进行插入和删除数据的操作栈的插入操作叫做压栈进栈栈的删除操作叫做出栈进行数据插入和删除操作的一端叫做栈顶另一端为栈底。栈中的元素遵循先进后出的原则。
1.2栈的结构示意图 2.栈的实现 栈一般分为静态栈和支持动态增长的栈静态栈由于栈的空间大小固定不具实用性所以我们只针对支持动态增长的栈进行代码实现
2.1支持动态增长的栈的结构 栈的实现一般使用数组形式来实现支持动态增长的栈即开辟一个动态数组a用来存储数据当栈的容量满了之后方便扩容。
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top; // 栈顶int capacity; // 容量
}Stack;
2.2压栈入栈 每次压栈首先检查栈的容量是否已满再决定是否需要扩容压栈的元素变为新的栈顶
// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps-top ps-capacity){int newcapacity ps-capacity 0 ? 5 : (ps-capacity) * 2;STDataType* tmp (STDataType*)realloc(ps-a, sizeof(STDataType) * newcapacity);if (tmp NULL){perror(realloc:);return;}ps-a tmp;ps-capacity newcapacity;}ps-a[ps-top] data;ps-top;
}
2.3出栈 出栈后新的栈顶变为出栈前的栈顶的前一个元素
// 出栈
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps-top--;
}
2.4支持动态增长的栈的代码实现
#pragma once
#includeassert.h
#includestdlib.h
#includestdio.h// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top; // 栈顶int capacity; // 容量
}Stack;// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps-a NULL;ps-top 0;//top指向栈顶的下一个位置,对top的操作需要是先使用后ps-capacity 0;
}// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);if (ps-top ps-capacity){int newcapacity ps-capacity 0 ? 5 : (ps-capacity) * 2;STDataType* tmp (STDataType*)realloc(ps-a, sizeof(STDataType) * newcapacity);if (tmp NULL){perror(realloc:);return;}ps-a tmp;ps-capacity newcapacity;}ps-a[ps-top] data;ps-top;
}// 出栈
void StackPop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));ps-top--;
}// 获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(!StackEmpty(ps));return ps-a[ps-top - 1];
}// 获取栈中有效元素个数
int StackSize(Stack* ps)
{assert(ps);return ps-top;
}// 检测栈是否为空如果为空返回非零结果如果不为空返回0
int StackEmpty(Stack* ps)
{assert(ps);return ps-top 0;
}// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);free(ps-a);ps-a NULL;ps-top 0;ps-capacity 0;
}
二、队列
1.队列的概念及结构
1.1队列的概念 不同于栈的概念队列只允许在其一端进行插入数据操作在另一端进行删除数据操作。进行插入数据操作的一端是队尾进行删除数据操作的一端是队头。队列是一种特殊的线性表遵循先进先出的原则。
1.2队列的结构示意图 2.队列的实现
2.1队列的结构 队列的实现一般使用链表的结构更优
代码
// 队列成员节点结构
typedef int QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构
typedef struct Queue
{QNode* front;QNode* rear;int size;
}Queue;
简图 2.2队尾入队列
代码
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* NewNode (QNode*)malloc(sizeof(QNode));if (NewNode NULL){perror(malloc:);return;}NewNode-data data;NewNode-next NULL;if (q-size 0){q-front q-rear NewNode;}else{q-rear-next NewNode;q-rear q-rear-next;}q-size;
}
简图 2.3队头出队列
代码
// 队头出队列
void QueuePop(Queue* q)
{assert(q);//assert(!QueueEmpty(q));if (q-front q-rear){if (q-front NULL){return;}else{free(q-front);q-front q-rear NULL;}}else{QNode* Tmp q-front;q-front Tmp-next;free(Tmp);Tmp NULL;}q-size--;
}
简图 2.4队列的代码实现
#pragma once
#includeassert.h
#includestdlib.h
#includestdio.h// 链式结构表示队列成员节点
typedef int QDataType;
typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;// 队列的结构
typedef struct Queue
{QNode* front;QNode* rear;int size;
}Queue;// 初始化队列
void QueueInit(Queue* q)
{assert(q);q-front q-rear NULL;q-size 0;
}// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{assert(q);QNode* NewNode (QNode*)malloc(sizeof(QNode));if (NewNode NULL){perror(malloc:);return;}NewNode-data data;NewNode-next NULL;if (q-size 0){q-front q-rear NewNode;}else{q-rear-next NewNode;q-rear q-rear-next;}q-size;
}// 队头出队列
void QueuePop(Queue* q)
{assert(q);//assert(!QueueEmpty(q));if (q-front q-rear){if (q-front NULL){return;}else{free(q-front);q-front q-rear NULL;}}else{QNode* Tmp q-front;q-front Tmp-next;free(Tmp);Tmp NULL;}q-size--;
}// 获取队列头部元素
QDataType QueueFront(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q-front-data;
}// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{assert(q);assert(!QueueEmpty(q));return q-rear-data;
}// 获取队列中有效元素个数
int QueueSize(Queue* q)
{assert(q);return q-size;
}// 检测队列是否为空如果为空返回非零结果如果非空返回0
int QueueEmpty(Queue* q)
{assert(q);return q-size 0 ? 1 : 0;
}// 销毁队列
void QueueDestroy(Queue* q)
{assert(q);while(!QueueEmpty(q)){QueuePop(q);}
}