栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合。这种数据结构只允许在栈顶进行添加(push)或删除(pop)元素的操作。换句话说,最新添加的元素会被最先移除。栈的这种特性使得它在多种编程和应用场景中非常有用,比如函数调用、括号匹配、表达式求值、页面访问历史等。
只允许从一端进行数据的插入和删除的线性存储结构
满增栈,满减栈,空增栈,空减栈
空栈,满栈:栈顶所在位置是否存有元素
增栈,减栈:栈的增长方向
增栈:内存低地址-----》内存高地址
链式栈是一种基于单链表的数据存储结构,它通过单链表的方式来实现栈的所有操作。链式栈的主要特点和优势如下:
Stack_t *create_stack()
{
Stack_t *stack = (Stack_t*)malloc(sizeof(Stack_t));
if(stack ==NULL)
{
perror("fail malloc");
return NULL;
}
stack->ptop = NULL;
stack->clen = 0;
return stack;
}
int push_stack(Stack_t *stack,DataType data)
{
SNode_t *pstack = (SNode_t *)malloc(sizeof(SNode_t));
if(pstack ==NULL)
{
perror("fail malloc");
return -1;
}
pstack->data = data;
pstack->pnext = NULL;
pstack->pnext = stack->ptop;
stack->ptop = pstack;
stack->clen++;
return 0;
}
int is_empty_stack(Stack_t *stack)
{
return stack->ptop == NULL;
}
int pop_stack(Stack_t *stack ,DataType *data)
{
if(is_empty_stack(stack))
return 0;
SNode_t *pstack = stack->ptop;
stack->ptop = pstack->pnext;
if(data != NULL)
{
*data= pstack->data;
}
free(pstack);
stack->clen--;
return 0;
}
int get_stack_top(Stack_t*stack,DataType *data)
{
if(stack == NULL)
return 0;
SNode_t *pstack = stack->ptop;
*data = pstack->data;
return 0;
}
void clear_stack(Stack_t* stack)
{
DataType e;
while(!is_empty_stack(stack))
{
pop_stack(stack, &e);
}
}
void destroy_stack(Stack_t * stack)
{
clear_stack(stack);
free(stack);
}
void print_stack(Stack_t *stack)
{
SNode_t *p = stack->ptop;
while(p != NULL)
{
printf("%d ", p->data);
p = p->pnext;
}
printf("\n");
}
Queue_t *create_queue()
{
Queue_t *pque = malloc(sizeof(Queue_t));
if (NULL == pque)
{
perror("fail malloc");
return NULL;
}
pque->pfront = NULL;
pque->prear = NULL;
pque->clen = 0;
pthread_mutex_init(&(pque->mutex), NULL);
return pque;
}
int is_empty_queue(Queue_t *pque)
{
return NULL == pque->pfront;
}
int push_queue(Queue_t *pque, QDataType data)
{
QNode_t *pnode = malloc(sizeof(QNode_t));
if (NULL == pnode)
{
perror("fail malloc");
return -1;
}
pnode->data = data;
pnode->pnext = NULL;
if (is_empty_queue(pque))
{
pque->pfront = pnode;
pque->prear = pnode;
}
else
{
pque->prear->pnext = pnode;
pque->prear = pnode;
}
pque->clen++;
return 0;
}
int pop_queue(Queue_t *pque, QDataType *pdata)
{
if (is_empty_queue(pque))
return 0;
QNode_t *pdel = pque->pfront;
pque->pfront = pdel->pnext;
if (pdata != NULL)
{
*pdata = pdel->data;
}
free(pdel);
if (NULL == pque->pfront)
{
pque->prear = NULL;
}
pque->clen--;
return 1;
}
int get_queue_front(Queue_t *pque, QDataType *pdata)
{
if (is_empty_queue(pque))
return 0;
if (NULL == pdata)
return 0;
*pdata = pque->pfront->data;
return 1;
}
void queue_for_each(Queue_t *pque)
{
QNode_t *p = pque->pfront;
while (p != NULL)
{
printf("%d ", p->data);
p = p->pnext;
}
printf("\n");
}
void clear_queue(Queue_t *pque)
{
while (!is_empty_queue(pque))
{
pop_queue(pque, NULL);
}
}
void destroy_queue(Queue_t *pque)
{
clear_queue(pque);
free(pque);
}
队列 | 栈 | |
---|---|---|
插入操作 | 在队尾进行,称为入队 | 在栈顶进行,称为进栈或压栈 |
删除操作 | 在队头进行,称为出队 | 在栈顶进行,称为出栈或退栈 |
访问方式 | 通常只能通过队头和队尾访问元素,不支持随机访问 | 只能访问栈顶元素,不支持随机访问 |