C语言用栈实现队列操作
时间: 2023-12-27 22:04:24 浏览: 99
可以实现队列操作,具体步骤如下:
1. 定义两个栈,一个作为入队栈,一个作为出队栈。
2. 入队操作时,直接将元素压入入队栈。
3. 出队操作时,先判断出队栈是否为空。如果不为空,直接弹出栈顶元素;如果为空,将入队栈的所有元素全部弹出并压入出队栈,然后再弹出栈顶元素。
4. 获取队首元素时,与出队操作类似,先判断出队栈是否为空,如果不为空,直接返回栈顶元素;如果为空,将入队栈的所有元素全部弹出并压入出队栈,然后返回栈顶元素。
需要注意的是,入队和出队操作的时间复杂度为O(1),但是获取队首元素的时间复杂度为O(n),因为需要将所有元素从入队栈转移到出队栈。
相关问题
使用c语言实现栈和队列的基本操作的全部代码
在C语言中,我们可以使用数组或链表来实现栈(Stack)和队列(Queue)。这里分别提供基本的栈和队列的结构体定义、初始化以及常见操作的代码示例。
**1. 栈(Stack)实现:**
```c
#include <stdio.h>
#define MAX_SIZE 50
typedef struct Stack {
int top;
int data[MAX_SIZE];
} Stack;
// 初始化栈
void init(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return (s->top == -1);
}
// 向栈顶压入元素
void push(Stack *s, int value) {
if (isEmpty(s)) {
s->top = 0;
} else {
s->data[++(s->top)] = value;
}
}
// 从栈顶弹出元素
int pop(Stack *s) {
if (isEmpty(s))
return -1; // 返回错误值
return s->data[s->top--];
}
// 获取栈顶元素但不删除
int peek(Stack *s) {
return isEmpty(s) ? -1 : s->data[s->top];
}
```
**2. 队列(Queue)实现:**
```c
#include <stdio.h>
#define MAX_SIZE 50
typedef struct Queue {
int front, rear;
int data[MAX_SIZE];
} Queue;
// 初始化队列
void init(Queue *q) {
q-1;
}
// 判断队列是否为空
int isEmpty(Queue *q) {
return (q->front == q->rear);
}
// 入队操作
void enqueue(Queue *q, int value) {
if ((q->rear + 1) % MAX_SIZE == q->front) {
printf("Queue is full.\n");
return;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = value;
}
// 出队操作
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("Queue is empty.\n");
return -1;
}
int removedValue = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return removedValue;
}
```
C语言用两个栈实现队列
在C语言中,可以利用两个栈(stack)来实现队列(queue),这是因为栈只允许在一端进行插入(push)和删除(pop)。通过这种方式,我们可以在第一个栈(先进先出栈,通常称为A栈)中入队,而在第二个栈(后进先出栈,称为B栈)中出队。当需要出队时,我们将B栈顶的元素弹出并压回A栈,这样新的元素就自然地出现在了A栈顶,实现了队列的操作。
以下是具体的实现过程:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
// 创建一个新节点
Node* newNode(int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
// 使用的第一个栈(先进先出)
void push_A(Node** top, int data) {
Node* new_node = newNode(data);
if (*top == NULL) {
*top = new_node;
} else {
new_node->next = *top;
*top = new_node;
}
}
// 使用的第二个栈(后进先出)
void push_B(Node** bottom, int data) {
Node* new_node = newNode(data);
if (*bottom == NULL) {
*bottom = new_node;
} else {
new_node->next = *bottom;
*bottom = new_node;
}
}
// 从B栈出队并在A栈入队
void enqueue(Node** A, Node** B) {
if (*B != NULL) {
Node* temp = *B;
while (temp->next != NULL) {
temp = temp->next;
}
push_A(A, temp->data);
free(temp);
}
}
// 从A栈出队
int dequeue(Node** top) {
if (*top == NULL) {
printf("Queue is empty\n");
return -1;
} else {
int data = (*top)->data;
Node* temp = *top;
*top = (*top)->next;
free(temp);
return data;
}
}
// 主函数测试
int main() {
Node* A_top = NULL, *A_bottom = NULL;
Node* B_top = NULL, *B_bottom = NULL;
enqueue(&A_top, &B_top, 1);
enqueue(&A_top, &B_top, 2);
enqueue(&A_top, &B_top, 3);
printf("Enqueued items: ");
while (dequeue(&A_top) != -1) {
printf("%d ", dequeue(&A_top));
}
enqueue(&A_top, &B_top, 4); // 增加一个元素到B栈
printf("\nDequeue from front: %d", dequeue(&A_top));
enqueue(&A_top, &B_top, 5); // 再次添加元素,证明队列特性
return 0;
}
```
这个实现中,`enqueue` 函数用于将元素添加到队列的末尾,而 `dequeue` 函数用于从队列的前端(实际上是A栈顶)取出元素。注意,为了保持A栈始终是先进先出,我们在B栈出队后立即把数据推到A栈。这样,每次从A栈出队实际上就是从队列前端取元素。
阅读全文