1. 栈的基本概念与操作

栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,最后插入的元素最先被删除。

栈的基本操作

  1. 初始化:创建一个空栈。
  2. 入栈(Push):将一个元素压入栈顶。
  3. 出栈(Pop):从栈顶删除一个元素。
  4. 取栈顶元素(Top):获取栈顶元素的值,但不删除它。
  5. 判断是否为空:检查栈是否为空。

2. 队列的基本概念与操作

队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构,最先插入的元素最先被删除。

队列的基本操作

  1. 初始化:创建一个空队列。
  2. 入队(Enqueue):将一个元素加入到队尾。
  3. 出队(Dequeue):从队头删除一个元素。
  4. 取队头元素(Front):获取队头元素的值,但不删除它。
  5. 判断是否为空:检查队列是否为空。

3. 栈的顺序存储结构

栈的顺序存储结构通常使用数组实现,栈顶指针 top 用于指向栈顶元素。

栈的顺序存储结构的 C++ 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#define MAX_SIZE 100

class Stack {
private:
int data[MAX_SIZE];
int top;

public:
Stack() : top(-1) {}

bool push(int value) {
if (top >= MAX_SIZE - 1) return false; // 栈满
data[++top] = value;
return true;
}

bool pop() {
if (top == -1) return false; // 栈空
top--;
return true;
}

int getTop() {
if (top == -1) return -1; // 栈空
return data[top];
}

bool isEmpty() {
return top == -1;
}

void display() {
for (int i = 0; i <= top; ++i) std::cout << data[i] << " ";
std::cout << std::endl;
}
};

4. 队列的顺序存储结构

队列的顺序存储结构可以用循环数组实现,使用 frontrear 两个指针分别指向队头和队尾。

队列的顺序存储结构的 C++ 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#define MAX_SIZE 100

class Queue {
private:
int data[MAX_SIZE];
int front, rear;

public:
Queue() : front(0), rear(0) {}

bool enqueue(int value) {
if ((rear + 1) % MAX_SIZE == front) return false; // 队列满
data[rear] = value;
rear = (rear + 1) % MAX_SIZE;
return true;
}

bool dequeue() {
if (front == rear) return false; // 队列空
front = (front + 1) % MAX_SIZE;
return true;
}

int getFront() {
if (front == rear) return -1; // 队列空
return data[front];
}

bool isEmpty() {
return front == rear;
}

void display() {
int i = front;
while (i != rear) {
std::cout << data[i] << " ";
i = (i + 1) % MAX_SIZE;
}
std::cout << std::endl;
}
};

5. 栈的链式存储结构

栈的链式存储结构使用链表实现,每次入栈和出栈都在链表的头部操作。

栈的链式存储结构的 C++ 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>

struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};

class LinkedStack {
private:
Node* top;

public:
LinkedStack() : top(nullptr) {}

void push(int value) {
Node* newNode = new Node(value);
newNode->next = top;
top = newNode;
}

bool pop() {
if (!top) return false; // 栈空
Node* temp = top;
top = top->next;
delete temp;
return true;
}

int getTop() {
return top ? top->data : -1; // 栈空返回 -1
}

bool isEmpty() {
return !top;
}

void display() {
Node* curr = top;
while (curr) {
std::cout << curr->data << " ";
curr = curr->next;
}
std::cout << std::endl;
}
};

6. 队列的链式存储结构

队列的链式存储结构使用链表实现,链表的头部作为队头,尾部作为队尾。

队列的链式存储结构的 C++ 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>

struct QNode {
int data;
QNode* next;
QNode(int val) : data(val), next(nullptr) {}
};

class LinkedQueue {
private:
QNode *front, *rear;

public:
LinkedQueue() : front(nullptr), rear(nullptr) {}

void enqueue(int value) {
QNode* newNode = new QNode(value);
if (!rear) {
front = rear = newNode;
} else {
rear->next = newNode;
rear = newNode;
}
}

bool dequeue() {
if (!front) return false; // 队列空
QNode* temp = front;
front = front->next;
if (!front) rear = nullptr; // 队列变空
delete temp;
return true;
}

int getFront() {
return front ? front->data : -1; // 队列空返回 -1
}

bool isEmpty() {
return !front;
}

void display() {
QNode* curr = front;
while (curr) {
std::cout << curr->data << " ";
curr = curr->next;
}
std::cout << std::endl;
}
};

总结

  • :遵循 LIFO 原则,典型操作包括入栈和出栈。
  • 队列:遵循 FIFO 原则,典型操作包括入队和出队。
  • 顺序存储:使用数组实现,适合容量固定的情况,操作简单。
  • 链式存储:使用链表实现,适合动态长度的情况,节省空间。