c语言 用两个栈实现队列的入队和出队操作的具体代码
时间: 2024-10-21 13:11:31 浏览: 21
在 C 语言中,使用两个栈来实现队列的入队(enqueue)和出队(dequeue)操作,你可以这样做:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
// 初始化队列
void initQueue(Node **front, Node **rear) {
*front = *rear = NULL;
}
// 入队操作
void enqueue(Node **front, Node **rear, int value) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
if (*front == NULL) {
*front = *rear = newNode;
} else {
newNode->next = *rear;
*rear = newNode;
}
}
// 出队操作(需要借助额外的栈)
int dequeue(Node **front, Node **rear) {
if (*front == NULL) return -1; // 队列为空
// 将前半部分元素移到第二个栈
Node *temp = *front;
while(temp != *rear) {
Node *tmp = temp;
temp = temp->next;
pushToStack(&stack1, tmp);
}
// 返回并删除第一个栈的顶部元素作为出队结果
int result = popFromStack(stack1);
free(temp); // 因为栈顶已转移到新栈,这里不需要free
// 重置指针,指向新栈的顶部
*front = stack1->top;
return result;
}
// 栈操作(假设有一个名为stack1的栈变量)
void pushToStack(Node **stack, Node *node) {
node->next = *stack;
*stack = node;
}
int popFromStack(Node **stack) {
if (*stack == NULL) return -1;
Node *oldTop = *stack;
*stack = oldTop->next;
int value = oldTop->data;
free(oldTop);
return value;
}
int main() {
Node *front = NULL, *rear = NULL;
initQueue(&front, &rear);
// 测试入队和出队
enqueue(&front, &rear, 1);
enqueue(&front, &rear, 2);
printf("Dequeued: %d\n", dequeue(&front, &rear)); // 输出1
printf("Dequeued: %d\n", dequeue(&front, &rear)); // 输出2
return 0;
}
```
在这个示例中,我们首先通过`enqueue`函数向队列中添加元素,然后通过`dequeue`函数结合辅助栈`stack1`完成出队操作。当队列为空时,`dequeue`会返回-1表示异常。
注意:这只是一个基本的实现,实际应用中可能需要对栈的管理、内存分配和错误处理进行更多的优化。
阅读全文