用c语言实现栈和队列基本操作 1.实现顺序栈和链栈及其插入、删除等操作; 2.实现循环队列和链队列及入队、出队等操作。
时间: 2024-10-14 19:12:47 浏览: 51
在C语言中,我们可以分别用数组和链表这两种数据结构来实现栈和队列。
**1. 实现顺序栈 (基于数组)**
- **插入 (push) 和删除 (pop) 操作**:
- 插入 (push): 当栈未满时,将元素添加到栈顶。数组下标从0开始,所以元素放在`top+1`位置,然后更新 top 指针。
```c
int stack[STACK_SIZE], top = -1;
void push(int x) {
if (top < STACK_SIZE - 1) {
top++;
stack[top] = x;
} else {
printf("Stack overflow!\n");
}
}
```
- 删除 (pop): 如果栈非空,则弹出并返回栈顶元素,否则报错。同时更新 top。
```c
int pop() {
if (top >= 0) {
int x = stack[top];
top--;
return x;
} else {
printf("Stack underflow!\n");
return -1; // 返回错误码或其他合适处理方式
}
}
```
**2. 实现链式栈 (基于链表)**
- 使用一个链表节点 struct Node 定义,包含数据和指向下一个节点的指针。
- 操作类似,只是用头结点 head 来表示栈顶。
- **插入 (push)**: 创建新节点并将它链接到 head 后面。
- **删除 (pop)**: 如果有节点,删除 head 指向的节点,然后如果 head 变为空,需要调整 head。
**3. 循环队列 (Circular Queue, 简称 CQueue)**
- 入队 (enqueue): 如果队列不满,则在队尾添加元素;若满则“溢出”回队首,形成循环。
- 出队 (dequeue): 若队列非空,则删除第一个元素,否则报错。注意要考虑到队首指针和队尾指针的情况。
```c
int queue[QUEUE_SIZE], front = 0, rear = 0;
void enqueue(int x) {
if ((rear + 1) % QUEUE_SIZE != front) {
rear = (rear + 1) % QUEUE_SIZE;
queue[rear] = x;
} else {
printf("Queue overflow!\n");
}
}
int dequeue() {
if (front != rear) {
int x = queue[front];
front = (front + 1) % QUEUE_SIZE;
return x;
} else {
printf("Queue underflow!\n");
return -1; // 错误处理
}
}
```
**4. 链式队列 (Linked Queue, LQueue)**
- 同样用链表实现,有两个指针分别指向队头和队尾。
以上代码仅为基本示例,实际使用时应考虑更多边界条件和错误处理。
阅读全文