用C语言实现:用一个队列实现栈
时间: 2024-02-11 08:31:43 浏览: 84
C语言实现栈与队列_C++
实现思路:
队列和栈都是一种数据结构,队列是先进先出(FIFO),而栈是后进先出(LIFO)。因此,我们可以用一个队列来实现栈。
具体实现方法是:栈的入栈操作相当于队列的入队操作,栈的出栈操作相当于队列的出队操作。但是,为了满足栈的后进先出的特点,我们需要在入栈时,将元素插入队列的队头。这样,在出栈时,我们就可以先取出队头的元素,即栈顶元素。
代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue {
int* data; // 数据存储区
int head; // 队首指针
int tail; // 队尾指针
int size; // 队列大小
} Queue;
Queue* create(int size) {
Queue* queue = (Queue*) malloc(sizeof(Queue));
queue->data = (int*) malloc(sizeof(int) * size);
queue->head = 0;
queue->tail = 0;
queue->size = size;
return queue;
}
void enqueue(Queue* queue, int value) {
if ((queue->tail + 1) % queue->size == queue->head) {
printf("Queue is full.\n");
return;
}
queue->data[queue->tail] = value;
queue->tail = (queue->tail + 1) % queue->size;
}
int dequeue(Queue* queue) {
if (queue->head == queue->tail) {
printf("Queue is empty.\n");
return -1;
}
int value = queue->data[queue->head];
queue->head = (queue->head + 1) % queue->size;
return value;
}
typedef struct Stack {
Queue* queue; // 队列指针
} Stack;
Stack* createStack(int size) {
Stack* stack = (Stack*) malloc(sizeof(Stack));
stack->queue = create(size);
return stack;
}
void push(Stack* stack, int value) {
enqueue(stack->queue, value);
// 将新入栈的元素移到队首
for (int i = 0; i < stack->queue->tail - stack->queue->head - 1; i++) {
int value = dequeue(stack->queue);
enqueue(stack->queue, value);
}
}
int pop(Stack* stack) {
return dequeue(stack->queue);
}
int main() {
Stack* stack = createStack(5);
push(stack, 1);
push(stack, 2);
push(stack, 3);
printf("%d\n", pop(stack)); // 3
printf("%d\n", pop(stack)); // 2
push(stack, 4);
push(stack, 5);
printf("%d\n", pop(stack)); // 5
printf("%d\n", pop(stack)); // 4
printf("%d\n", pop(stack)); // 1
return 0;
}
```
在这个实现中,我们用一个队列来实现了栈的基本操作。当需要入栈时,将元素插入队列的队头,然后将队列中所有元素依次出队并入队,使得新插入的元素成为队列的队首元素。出栈时,直接出队即可。
阅读全文