返回

C 语言实现栈

后端

栈是一种遵循先进后出的数据结构,具有先入后出(FILO)的特性。它和队列类似,也是线性的数据结构。在 C 语言中,栈可以利用顺序表的数据结构来实现。

栈的定义与基本操作

一个栈包含一个数组和一个栈顶指针,栈顶指针指向栈中最后一个元素的位置。入栈是指把一个元素放入栈中,即把一个元素添加到数组中并更新栈顶指针。出栈是指把一个元素从栈中取出,即从数组中删除最后一个元素并更新栈顶指针。获取栈顶元素是指把一个元素从栈中取出而不删除它,即把一个元素从数组中删除并更新栈顶指针。

C 语言实现栈

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

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

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

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

void push(Stack *s, int data) {
    if (s->top == MAX_SIZE - 1) {
        printf("Stack is full\n");
        return;
    }
    s->data[++s->top] = data;
}

int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        return -1;
    }
    return s->data[s->top--];
}

int peek(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        return -1;
    }
    return s->data[s->top];
}

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

    push(&s, 1);
    push(&s, 2);
    push(&s, 3);

    printf("%d\n", peek(&s));
    printf("%d\n", pop(&s));
    printf("%d\n", peek(&s));

    return 0;
}

初始化栈

首先,需要初始化栈,即把栈顶指针设置为 -1。

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

判断栈是否为空

接着,需要判断栈是否为空,即检查栈顶指针是否等于 -1。

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

入栈

入栈操作是把一个元素添加到栈中。首先,需要检查栈是否已满。如果栈已满,则无法再入栈。否则,把元素添加到数组中并更新栈顶指针。

void push(Stack *s, int data) {
    if (s->top == MAX_SIZE - 1) {
        printf("Stack is full\n");
        return;
    }
    s->data[++s->top] = data;
}

出栈

出栈操作是把一个元素从栈中取出。首先,需要检查栈是否为空。如果栈为空,则无法再出栈。否则,从数组中删除最后一个元素并更新栈顶指针。

int pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        return -1;
    }
    return s->data[s->top--];
}

获取栈顶元素

获取栈顶元素操作是把一个元素从栈中取出而不删除它。首先,需要检查栈是否为空。如果栈为空,则无法再获取栈顶元素。否则,从数组中删除最后一个元素并更新栈顶指针。

int peek(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack is empty\n");
        return -1;
    }
    return s->data[s->top];
}