用c语言实现两个栈模拟队列
时间: 2023-11-28 11:06:29 浏览: 94
可以使用两个栈来模拟队列,具体实现如下:
1. 定义两个栈 Stack1 和 Stack2,用 Stack1 来存放入队的元素,用 Stack2 来处理出队操作。
2. 入队操作:将元素压入 Stack1。
3. 出队操作:首先判断 Stack2 是否为空,如果不为空,则弹出栈顶元素;如果为空,将 Stack1 中的元素依次出栈并压入 Stack2,再弹出栈顶元素。
下面是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义栈结构体
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isStackEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int isStackFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack *s, int value) {
if (isStackFull(s)) {
printf("Stack overflow!\n");
exit(1);
}
s->data[++s->top] = value;
}
// 出栈
int pop(Stack *s) {
if (isStackEmpty(s)) {
printf("Stack underflow!\n");
exit(1);
}
return s->data[s->top--];
}
// 定义队列结构体
typedef struct {
Stack s1;
Stack s2;
} Queue;
// 初始化队列
void initQueue(Queue *q) {
initStack(&q->s1);
initStack(&q->s2);
}
// 入队
void enqueue(Queue *q, int value) {
push(&q->s1, value);
}
// 出队
int dequeue(Queue *q) {
int value;
if (isStackEmpty(&q->s2)) {
while (!isStackEmpty(&q->s1)) {
value = pop(&q->s1);
push(&q->s2, value);
}
if (isStackEmpty(&q->s2)) {
printf("Queue underflow!\n");
exit(1);
}
}
return pop(&q->s2);
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 10);
enqueue(&q, 20);
enqueue(&q, 30);
printf("%d\n", dequeue(&q));
printf("%d\n", dequeue(&q));
printf("%d\n", dequeue(&q));
return 0;
}
```
阅读全文