您好,登录后才能下订单哦!
在计算机科学中,栈(Stack)和队列(Queue)是两种非常重要的数据结构。它们广泛应用于各种算法和程序中,如表达式求值、函数调用、任务调度等。本文将详细介绍如何在C语言中实现栈和队列,并通过代码示例帮助读者理解其工作原理。
栈是一种遵循后进先出(LIFO, Last In First Out)原则的线性数据结构。这意味着最后进入栈的元素将最先被移除。栈的操作主要包括:
在C语言中,栈可以通过数组或链表来实现。下面我们将分别介绍这两种实现方式。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
bool isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
bool isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack *s, int value) {
if (isFull(s)) {
printf("栈已满,无法入栈\n");
return;
}
s->data[++s->top] = value;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无法出栈\n");
exit(EXIT_FLURE);
}
return s->data[s->top--];
}
// 查看栈顶元素
int peek(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无法查看栈顶元素\n");
exit(EXIT_FLURE);
}
return s->data[s->top];
}
int main() {
Stack s;
initStack(&s);
push(&s, 10);
push(&s, 20);
push(&s, 30);
printf("栈顶元素: %d\n", peek(&s));
printf("出栈元素: %d\n", pop(&s));
printf("出栈元素: %d\n", pop(&s));
printf("栈顶元素: %d\n", peek(&s));
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct {
Node *top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = NULL;
}
// 判断栈是否为空
bool isEmpty(Stack *s) {
return s->top == NULL;
}
// 入栈
void push(Stack *s, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
exit(EXIT_FLURE);
}
newNode->data = value;
newNode->next = s->top;
s->top = newNode;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无法出栈\n");
exit(EXIT_FLURE);
}
Node *temp = s->top;
int value = temp->data;
s->top = temp->next;
free(temp);
return value;
}
// 查看栈顶元素
int peek(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无法查看栈顶元素\n");
exit(EXIT_FLURE);
}
return s->top->data;
}
int main() {
Stack s;
initStack(&s);
push(&s, 10);
push(&s, 20);
push(&s, 30);
printf("栈顶元素: %d\n", peek(&s));
printf("出栈元素: %d\n", pop(&s));
printf("出栈元素: %d\n", pop(&s));
printf("栈顶元素: %d\n", peek(&s));
return 0;
}
栈在计算机科学中有广泛的应用,例如:
队列是一种遵循先进先出(FIFO, First In First Out)原则的线性数据结构。这意味着最先进入队列的元素将最先被移除。队列的操作主要包括:
在C语言中,队列可以通过数组或链表来实现。下面我们将分别介绍这两种实现方式。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// 判断队列是否为空
bool isEmpty(Queue *q) {
return q->front == -1 && q->rear == -1;
}
// 判断队列是否已满
bool isFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
// 入队
void enqueue(Queue *q, int value) {
if (isFull(q)) {
printf("队列已满,无法入队\n");
return;
}
if (isEmpty(q)) {
q->front = 0;
}
q->rear = (q->rear + 1) % MAX_SIZE;
q->data[q->rear] = value;
}
// 出队
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列为空,无法出队\n");
exit(EXIT_FLURE);
}
int value = q->data[q->front];
if (q->front == q->rear) {
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return value;
}
// 查看队头元素
int peek(Queue *q) {
if (isEmpty(q)) {
printf("队列为空,无法查看队头元素\n");
exit(EXIT_FLURE);
}
return q->data[q->front];
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 10);
enqueue(&q, 20);
enqueue(&q, 30);
printf("队头元素: %d\n", peek(&q));
printf("出队元素: %d\n", dequeue(&q));
printf("出队元素: %d\n", dequeue(&q));
printf("队头元素: %d\n", peek(&q));
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
typedef struct {
Node *front;
Node *rear;
} Queue;
// 初始化队列
void initQueue(Queue *q) {
q->front = NULL;
q->rear = NULL;
}
// 判断队列是否为空
bool isEmpty(Queue *q) {
return q->front == NULL;
}
// 入队
void enqueue(Queue *q, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
if (newNode == NULL) {
printf("内存分配失败\n");
exit(EXIT_FLURE);
}
newNode->data = value;
newNode->next = NULL;
if (isEmpty(q)) {
q->front = q->rear = newNode;
} else {
q->rear->next = newNode;
q->rear = newNode;
}
}
// 出队
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列为空,无法出队\n");
exit(EXIT_FLURE);
}
Node *temp = q->front;
int value = temp->data;
q->front = temp->next;
if (q->front == NULL) {
q->rear = NULL;
}
free(temp);
return value;
}
// 查看队头元素
int peek(Queue *q) {
if (isEmpty(q)) {
printf("队列为空,无法查看队头元素\n");
exit(EXIT_FLURE);
}
return q->front->data;
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 10);
enqueue(&q, 20);
enqueue(&q, 30);
printf("队头元素: %d\n", peek(&q));
printf("出队元素: %d\n", dequeue(&q));
printf("出队元素: %d\n", dequeue(&q));
printf("队头元素: %d\n", peek(&q));
return 0;
}
队列在计算机科学中也有广泛的应用,例如:
栈和队列虽然都是线性数据结构,但它们的操作方式和应用场景有所不同:
操作方式:
应用场景:
栈和队列是计算机科学中最基本的数据结构之一,理解它们的实现原理和应用场景对于编写高效的程序至关重要。本文通过C语言代码示例详细介绍了如何使用数组和链表实现栈和队列,并探讨了它们的应用场景。希望本文能帮助读者更好地理解和掌握这两种数据结构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。