栈
一种特殊的的线性表,只允许在固定的一端进行插入和删除操作。栈被称作是先进后出的线性表。
队列
只允许在一端进行插入数据操作,在另一端删除数据操作的特殊线性表。具有先进先出的特性。
循环队列(简单了解)
- 队空 rear == front;
- 队满 (rear + 1) % Maxsize == front;
栈的基本操作
初始化、销毁、增、删、查
- 定义一个静态栈
typedef int StackDataType;
#define MAX_SIZE (100)
typedef struct Stack {
StackDataType array[MAX_SIZE];
int top; // 表示当前个数
} Stack;
- 初始化
void StackInit(Stack* pStack)
{
pStack->top = 0;
}
- 销毁
void StackDestroy(Stack* pStack)
{
pStack->top = 0;
}
- 增
void StackPush(Stack* pStack, StackDataType data)
{
assert(pStack != NULL);
pStack->array[pStack->top] = data;
pStack->top++;
}
- 删
void StackPop(Stack* pStack)
{
assert(pStack->top > 0);
pStack->top--;
}
- 查看栈顶元素
StackDataType StackTop(Stack* pStack)
{
assert(pStack->top > 0);
return pStack->array[pStack->top - 1];
}
- 元素个数
int StackSize(const Stack *pStack)
{
return pStack->top;
}
- 栈满
int StackFull(const Stack *pStack)
{
return pStack->top >= MAX_SIZE;
}
- 栈空
int StackEmpty(const Stack *pStack)
{
return pStack->top <= 0;
}
链式队列的基本操作
初始化、销毁、插入(队尾插入)、删除(队头删除)、查看队首数据
- 定义
typedef int QDataType;
typedef struct QNode {
QDataType data;
struct QNode *next;
} QNode;
typedef struct Queue {
QNode *front;
QNode *rear;
} Queue;
- 初始化
void QueueInit(Queue *pQueue)
{
pQueue->front = pQueue->rear = NULL;
}
- 销毁
void QueueDestroy(Queue *pQueue)
{
QNode *cur, *next;
for (cur = pQueue->front; cur != NULL; cur = next) {
next = cur->next;
free(cur);
}
pQueue->front = pQueue->rear = NULL;
}
- 增(尾增)
//创建节点
static QNode * CreateNode(QDataType data)
{
QNode *node = (QNode *)malloc(sizeof(QNode));
assert(node);
node->data = data;
node->next = NULL;
return node;
}
void QueuePush(Queue *pQueue, QDataType data)
{
QNode* newNode = CreateNode(data);
if (pQueue->front == NULL)
{
pQueue->front = pQueue->rear = newNode;
return;
}
pQueue->rear->next = newNode;
pQueue->rear = newNode;
}
- 删(头删)
void QueuePop(Queue *pQueue)
{
assert(pQueue != NULL); // 地址需要有效
assert(pQueue->front != NULL); // 队列为空,不支持
QNode *del = pQueue->front;
pQueue->front = pQueue->front->next;
free(del);
// 队列中只有一个结点
if (pQueue->front == NULL) {
pQueue->rear = NULL;
}
}
- 查(查看队首元素)
QDataType QueueFront(Queue *pQueue)
{
assert(pQueue != NULL); // 地址需要有效
assert(pQueue->front != NULL); // 队列为空,不支持
return pQueue->front->data;
}
- 队空
int QueueEmpty(const Queue *pQueue)
{
return pQueue->front == NULL;
}
- 元素个数
int QueueSize(const Queue *pQueue)
{
int size = 0;
QNode *cur;
for (cur = pQueue->front; cur != NULL; cur = cur->next) {
size++;
}
return size;
}