一、栈(Stack)的概念
栈是一种操作受限的线性表,遵循后进先出(LIFO, Last In First Out) 原则。所有操作(插入、删除、访问)只能在 栈顶(Top) 进行。最后进入栈的元素最先被取出,就像一叠盘子:后放的盘子先被拿走。
二、队列(Queue)的概念
队列是一种操作受限的线性表,遵循先进先出(FIFO:First In First Out) 原则。只允许在队尾插入,在队头删除。最早进入队列的元素最先被取出,就像排队买票:先来的人先买到票。
三、栈和队列的核心区别

四、栈和队列(C语言实现)
栈的实现方法
c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top; // 栈顶指针
} SeqStack;
// 初始化栈
void initStack(SeqStack *s) {
s->top = -1;
}
// 判断栈空
bool isEmpty(SeqStack *s) {
return s->top == -1;
}
// 判断栈满
bool isFull(SeqStack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
bool push(SeqStack *s, int value) {
if (isFull(s)) {
printf("栈满,无法入栈\n");
return false;
}
s->data[++(s->top)] = value;
return true;
}
// 出栈
bool pop(SeqStack *s, int *value) {
if (isEmpty(s)) {
printf("栈空,无法出栈\n");
return false;
}
*value = s->data[(s->top)--];
return true;
}
// 获取栈顶元素
bool getTop(SeqStack *s, int *value) {
if (isEmpty(s)) {
return false;
}
*value = s->data[s->top];
return true;
}
// 打印栈
void printStack(SeqStack *s) {
if (isEmpty(s)) {
printf("栈为空\n");
return;
}
printf("栈底 -> ");
for (int i = 0; i <= s->top; i++) {
printf("%d ", s->data[i]);
}
printf("<- 栈顶\n");
}
队列的实现方法
c
#define QUEUE_SIZE 100
typedef struct {
int data[QUEUE_SIZE];
int front; // 队头指针
int rear; // 队尾指针
} SeqQueue;
// 初始化队列
void initQueue(SeqQueue *q) {
q->front = q->rear = 0;
}
// 判断队空
bool isQueueEmpty(SeqQueue *q) {
return q->front == q->rear;
}
// 判断队满(牺牲一个单元)
bool isQueueFull(SeqQueue *q) {
return (q->rear + 1) % QUEUE_SIZE == q->front;
}
// 入队
bool enQueue(SeqQueue *q, int value) {
if (isQueueFull(q)) {
printf("队列满\n");
return false;
}
q->data[q->rear] = value;
q->rear = (q->rear + 1) % QUEUE_SIZE;
return true;
}
// 出队
bool deQueue(SeqQueue *q, int *value) {
if (isQueueEmpty(q)) {
printf("队列空\n");
return false;
}
*value = q->data[q->front];
q->front = (q->front + 1) % QUEUE_SIZE;
return true;
}
// 获取队头元素
bool getFront(SeqQueue *q, int *value) {
if (isQueueEmpty(q)) return false;
*value = q->data[q->front];
return true;
}
// 获取队列长度
int getQueueLength(SeqQueue *q) {
return (q->rear - q->front + QUEUE_SIZE) % QUEUE_SIZE;
}