栈与队列是程序中常用的两种线性数据结构,它们的核心区别在于数据操作顺序:栈按照“后进先出”进行修改,队列按照“先进先出”进行修改。
1.核心区别
特性 | 栈 (Stack) | 队列 (Queue) |
---|---|---|
数据顺序 | 后进先出 (LIFO) | 先进先出 (FIFO) |
操作位置 | 同一端(栈顶) | 插入在队尾,删除在队首 |
典型操作 | push , pop , peek | enqueue , dequeue , peek |
应用场景 | 函数调用、括号匹配、递归 | 任务调度、BFS遍历、缓冲区 |
2.代码演示
2.1 栈的实现
以栈中元素为整型为例,实现栈基本运算函数定义如下
typedef struct nodo{
int data; //节点的数据域
struct node *next; //节点的指针域
}Node, *LinkList;
typedef struct{
LinkList top; //栈顶头指针
}Stack;
//创建一个单链表空栈
void initStack(Stack *s)
{
s->top = NULL;
}
//元素入栈,若成功则返回1,否则返回0
int push(Stack *s,int n)
{
Node *p = (Node *)malloc(sizeof(Node));
if(!p) return 0;
p->data = n;
p->next = s->top;
s->top = p;
return 1;
}
//元素出栈,非空栈的栈顶元素出栈,成功则返回1,否则返回0
int pop(Stack *s)
{
Node *p = s->top;
if(!p) return 0;
s->top = p->next;
free(p);
return 1;
}
//读取并返回栈顶元素,成功则返回1,否则返回0
int top(Stack *s ,int *n)
{
if(!s.top) return 0;
*n = s.top->data;
return 1;
}
//判断栈是否空,是则返回1,否则返回0
int isEmpty(Stack s)
{
return (s.top == NULL);
}
2.2 队列的实现
#define MAX_SIZE 100
typedef struct {
int *base; //队列存储空间首地址
int front,rear; //队头、队尾指针
}sqQueue;
//创建一个容量为MAX_SIZE的空队列,若成功则返回1,否则返回0
int initQueue(SqQueue *q)
{
q->base = (int *)malloc(MAX_SIZE*sizeof(int));
if(!q->base) return 0;
q->front = 0;
q->rear = 0;
return 1;
}
//判断栈是否空,是则返回1,否则返回0
int isEmpty(SqQueue q)
{
return (q->front == q->rear);
}
//元素入队列,成功则返回1,否则返回0
int enQueue(SqQueue *q,int n)
{
if((q->rear+1) % MAX_SIZE == q->front) retuen 0;
q->base[q->rear} = n;
q->rear = (q->rear + 1] % MAX_SIZE;
return 1;
}
//元素出队列,若队列不空,则删除头元素,n带回该值并返回1,否则返回0
int delQueue(SqQueue *q,int *n)
{
if(q->raer == q->front) return 0;
*n = q->base[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return 1;
}