#栈
1、概念
栈是一种“先进后出”的数据结构。
先进入栈的数据会被压在栈底,后进入的数据会在栈顶。
栈的元素只能从栈顶取。也就是说,如果先要取到1,就必须把上面的元素全取走。
2、栈的基本操作
栈分为“链表栈”和“顺序栈”,链表栈用节点实现,顺序栈用数组实现,这里只展示顺序栈。
栈的基本操作包括:入栈、出栈、获取栈顶元素、判断栈是否为空。
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _capacity; // 容量
int _top; //栈顶
}Stack;
// 初始化栈
void StackInit(Stack* ps)
{
assert(ps);
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = -1;
}
//扩容
void AddCapacity(Stack* ps)
{
assert(ps);
if (ps->_capacity==0)
{
ps->_capacity = 4;
}
else
{
ps->_capacity = ps->_capacity * 2;
}
ps->_a = (STDataType*)realloc(ps->_a,sizeof(STDataType)*ps->_capacity);
}
//入栈
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->_capacity == ps->_top + 1||ps->_capacity==0)
AddCapacity(ps);
ps->_top++;
ps->_a[ps->_top] = data;
}
// 出栈
void StackPop(Stack* ps)
{
assert(ps);
ps->_top--;
}
// 获取栈顶元素
STDataType StackTop(Stack* ps)
{
return ps->_a[ps->_top];
}
// 获取栈中有效元素个数
int StackSize(Stack* ps)
{
return ps->_top+1;
}
// 检测栈是否为空,如果为空返回1,如果不为空返回0
int StackEmpty(Stack* ps)
{
if (ps->_top == -1)
{
return 1;
}
else
{
return 0;
}
}
// 销毁栈
void StackDestroy(Stack* ps)
{
free(ps->_a);
ps->_a = NULL;
ps->_capacity = 0;
ps->_top = -1;
}
#队列
1、概念
队列是一种“先进先出”的数据结构。
就像排队一样,先排的人先走,后排的人后走。
2、队列的基本操作
队列也有“顺序队列”和“链队列”,这里只展示链队列。
队列的基本操作包括:入队、出队、获取队头/队尾元素、判空。
typedef struct QListNode
{
struct QListNode* _next;
QDataType _data;
}QNode;
// 队列的结构
typedef struct Queue
{
QNode* _front;
QNode* _rear;
}Queue;
//创建队列节点
QNode* CreateQueueNode()
{
QNode* ret = (QNode*)malloc(sizeof(QNode));
return ret;
}
// 初始化队列
void QueueInit(Queue* q)
{
assert(q);
q->_front = NULL;
q->_rear = NULL;
}
// 队尾入队列
void QueuePush(Queue* q, QDataType data)
{
assert(q);
if (q->_front == NULL)
{
q->_front=q->_rear = CreateQueueNode();
q->_rear->_data = data;
q->_rear->_next=NULL;
}
else
{
q->_rear->_next = CreateQueueNode();
q->_rear = q->_rear->_next;
q->_rear->_data = data;
q->_rear->_next = NULL;
}
}
// 队头出队列
void QueuePop(Queue* q)
{
assert(q);
QNode* ret = q->_front;
q->_front = q->_front->_next;
free(ret);
}
// 获取队列头部元素
QDataType QueueFront(Queue* q)
{
assert(q);
return q->_front->_data;
}
// 获取队列队尾元素
QDataType QueueBack(Queue* q)
{
assert(q);
return q->_rear->_data;
}
// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
assert(q);
QNode* ret = q->_front;
int count = 0;
while (ret != NULL)
{
q++;
ret = ret->_next;
}
return count;
}
// 检测队列是否为空,如果为空返回1,如果非空返回0
int QueueEmpty(Queue* q)
{
assert(q);
if (q->_front == NULL)
{
return 1;
}
else
{
return 0;
}
}
// 销毁队列
void QueueDestroy(Queue* q)
{
assert(q);
QNode* ret = q->_front;
while (q->_front != NULL)
{
q->_front = q->_front->_next;
free(ret);
ret = q->_front;
}
}