栈的常见操作(C)

栈的常见操作

栈的基本概念

  • 栈是一种 后进先出(LIFO, Last In First Out) 的数据结构。
  • 栈的操作集中在栈顶(top):
    • Push(压栈):向栈中添加元素,放置在栈顶。
    • Pop(出栈):移除并返回栈顶元素。
    • ReadTop /Peek:查看栈顶元素但不移除。
    • IsEmpty:检查栈是否为空。
    • IsFull:检查栈是否已满。

在实现栈时,可以通过 数组 或 链表 来模拟栈的结构。这里我们通过 数组实现栈。

栈的实现结构

首先,需要定义一个栈的结构体:

c 复制代码
typedef struct {
    int data[MAX]; // 使用数组存储栈的元素
    int top;       // 栈顶指针,指向栈顶的元素索引
} Stack;
  • data[MAX] :数组用来存储栈中的元素,MAX 是栈的容量。
  • top :记录当前栈顶元素的位置。如果栈为空,top 的值为 -1。

栈操作的详细实现

1. 初始化栈

初始化栈时,将栈顶指针设置为 -1,表示栈为空。

c 复制代码
void initStack(Stack *s) {
    s->top = -1; // 初始化栈顶指针
}

解释:

  • s->top = -1;:栈为空时,top 被设置为 -1,这是栈的初始状态。

2. Push(压栈)

功能:

  • 将元素压入栈顶。
  • 如果栈未满(top < MAX - 1),将元素插入到栈顶,并将 top 向上移动一位。
  • 如果栈已满(top == MAX - 1),输出错误信息,不能再压入新元素。
c 复制代码
void push(Stack *s, int element) {
    if (s->top == MAX - 1) { // 检查栈是否已满
        printf("Stack is full. Cannot push element %d.\n", element);
    } else {
        s->top++;                // 栈顶指针上移
        s->data[s->top] = element; // 将元素放到栈顶
        printf("Element %d pushed to stack.\n", element);
    }
}

工作原理:

  1. 首先检查栈是否已满:s->top == MAX - 1。
  2. 如果栈未满:
    • 将 s->top 的值增加 1,表示栈顶上移一位。
    • 将新元素赋值给 data[s->top],即放入栈顶。
  3. 如果栈已满,输出错误信息。

示例:

c 复制代码
Stack s;
initStack(&s);

push(&s, 10); // 压入元素 10
push(&s, 20); // 压入元素 20
push(&s, 30); // 压入元素 30
push(&s, 40); // 压入元素 40
push(&s, 50); // 压入元素 50
push(&s, 60); // 栈满,不能压入

输出:

复制代码
Element 10 pushed to stack.
Element 20 pushed to stack.
Element 30 pushed to stack.
Element 40 pushed to stack.
Element 50 pushed to stack.
Stack is full. Cannot push element 60.

3. Pop(出栈)

功能:

  • 从栈顶移除元素并返回该元素。
  • 如果栈为空(top == -1),输出错误信息,不能执行出栈操作。
c 复制代码
int pop(Stack *s) {
    if (s->top == -1) { // 检查栈是否为空
        printf("Stack is empty. Cannot pop element.\n");
        return -1; // 返回 -1 表示失败
    } else {
        int poppedElement = s->data[s->top]; // 获取栈顶元素
        s->top--; // 栈顶指针下移
        printf("Element %d popped from stack.\n", poppedElement);
        return poppedElement;
    }
}

工作原理:

  1. 首先检查栈是否为空:s->top == -1。
  2. 如果栈非空:
    • 获取栈顶元素:data[s->top]。
    • 将 s->top 减 1,表示栈顶指针下移,移除栈顶元素。
  3. 如果栈为空,输出错误信息。

示例:

c 复制代码
Stack s;
initStack(&s);

push(&s, 10);
push(&s, 20);
push(&s, 30);

pop(&s); // 移除 30
pop(&s); // 移除 20
pop(&s); // 移除 10
pop(&s); // 栈为空,不能移除

输出:

复制代码
Element 30 popped from stack.
Element 20 popped from stack.
Element 10 popped from stack.
Stack is empty. Cannot pop element.

4. ReadTop(查看栈顶元素)

功能:

  • 返回栈顶元素但不移除它。
  • 如果栈为空,输出错误信息并返回 -1。
c 复制代码
int readTop(Stack *s) {
    if (s->top == -1) { // 检查栈是否为空
        printf("Stack is empty. No top element.\n");
        return -1;
    } else {
        printf("Top element is %d.\n", s->data[s->top]);
        return s->data[s->top];
    }
}

工作原理:

  1. 检查栈是否为空:s->top == -1。
  2. 如果栈非空,直接返回栈顶元素 data[s->top]。

示例:

c 复制代码
Stack s;
initStack(&s);

push(&s, 10);
push(&s, 20);

readTop(&s); // 查看栈顶元素 20

输出:

复制代码
Element 10 pushed to stack.
Element 20 pushed to stack.
Top element is 20.

5. IsEmpty(栈是否为空)

功能:

  • 检查栈是否为空。如果栈为空,返回 1;否则返回 0。
c 复制代码
int isEmpty(Stack *s) {
    return s->top == -1;
}

示例:

c 复制代码
Stack s;
initStack(&s);

printf("Is stack empty? %d\n", isEmpty(&s)); // 输出 1 (True)
push(&s, 10);
printf("Is stack empty? %d\n", isEmpty(&s)); // 输出 0 (False)

输出:

复制代码
Is stack empty? 1
Element 10 pushed to stack.
Is stack empty? 0

6. IsFull(栈是否已满)

功能:

  • 检查栈是否已满。如果栈已满,返回 1;否则返回 0。
c 复制代码
int isFull(Stack *s) {
    return s->top == MAX - 1;
}

示例:

c 复制代码
Stack s;
initStack(&s);

push(&s, 10);
push(&s, 20);
push(&s, 30);
push(&s, 40);
push(&s, 50);

printf("Is stack full? %d\n", isFull(&s)); // 输出 1 (True)

输出:

复制代码
Element 10 pushed to stack.
Element 20 pushed to stack.
Element 30 pushed to stack.
Element 40 pushed to stack.
Element 50 pushed to stack.
Is stack full? 1

完整代码:实现所有栈操作

c 复制代码
#include <stdio.h>
#define MAX 5

typedef struct {
    int data[MAX];
    int top;
} Stack;

void initStack(Stack *s) {
    s->top = -1;
}

void push(Stack *s, int element) {
    if (s->top == MAX - 1) {
        printf("Stack is full. Cannot push element %d.\n", element);
    } else {
        s->top++;
        s->data[s->top] = element;
        printf("Element %d pushed to stack.\n", element);
    }
}

int pop(Stack *s) {
    if (s->top == -1) {
        printf("Stack is empty. Cannot pop element.\n");
        return -1;
    } else {
        int poppedElement = s->data[s->top];
        s->top--;
        printf("Element %d popped from stack.\n", poppedElement);
        return poppedElement;
    }
}

int readTop(Stack *s) {
    if (s->top == -1) {
        printf("Stack is empty. No top element.\n");
        return -1;
    } else {
        printf("Top element is %d.\n", s->data[s->top]);
        return s->data[s->top];
    }
}

int isEmpty(Stack *s) {
    return s->top == -1;
}

int isFull(Stack *s) {
    return s->top == MAX - 1;
}

int main() {
    Stack s;
    initStack(&s);

    push(&s, 10);
    push(&s, 20);
    readTop(&s);
    pop(&s);
    printf("Is stack empty? %d\n", isEmpty(&s));
    push(&s, 30);
    push(&s, 40);
    push(&s, 50);
    push(&s, 60);
    printf("Is stack full? %d\n", isFull(&s));

    return 0;
}

运行输出

复制代码
Element 10 pushed to stack.
Element 20 pushed to stack.
Top element is 20.
Element 20 popped from stack.
Is stack empty? 0
Element 30 pushed to stack.
Element 40 pushed to stack.
Element 50 pushed to stack.
Stack is full. Cannot push element 60.
Is stack full? 1
相关推荐
努力努力再努力wz1 分钟前
【CUDA入门系列】CUDA编程实战:设备选择、显存管理、Kernel、Stream 与 Event 全流程梳理
开发语言·c++
lhbweilai5 分钟前
深挖FreeRTOS内核实现(二)
c语言·汇编·stm32·单片机
杨丰玮41811 分钟前
C语言核心语法
java·c语言·开发语言·学习方法
ttwuai14 分钟前
Go开源后台管理系统推荐:README、源码和License应该怎么验
开发语言·golang·开源
Java后端的Ai之路17 分钟前
Python 进阶探索30 - Python中的装饰器
开发语言·人工智能·python·文件处理·装饰器模式
沫璃染墨17 分钟前
《从零入门Linux系统篇(五十八):线程篇·十一——线程安全与死锁详解:从可重入到多锁管理》
linux·服务器·开发语言·c++·驱动开发·安全·架构
黑妹天下第一乖26 分钟前
第 05 讲:阿加犀 AidCV 图像处理加速与 OpenCV 一致开发实战
开发语言·图像处理·人工智能·嵌入式硬件·数码相机·opencv·计算机视觉
言乐627 分钟前
Python基于关键词分拣快递(适用于电商与货运代理等)
开发语言·python·django·virtualenv·pygame
一条破秋裤33 分钟前
01_字符设备基本概念_从分类到LED控制链路
开发语言·php
朝朝辞暮i39 分钟前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2