欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用C语言实现先进后出的数据结构---栈

程序员文章站 2024-03-18 12:04:16
...

数据结构----栈

一、基本概念

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

                                                      ---百度百科

二、用C语言实现栈

1.定义栈的结构体

typedef struct Stack{
    struct Stack *bottom;//栈顶指针指向底部
    int size;//栈内元素的个数
    int top_elem;//栈顶元素的值
}S;

2.定义创建栈的函数

S *create_Stack(){
    S *Stack = (S *)malloc(sizeof(S));
    Stack->bottom = NULL;
    Stack->size = 0;
    return Stack;
}

3.定义创建栈内元素的函数

因为创建的元素只能在栈顶进行入栈操作,所以也可将其称为栈顶元素。

S *create_new_Elem(int data)//创建栈顶元素
{
    S *new_elem = (S *)malloc(sizeof(S));
    new_elem->bottom = NULL;
    new_elem->top_elem = data;
    return new_elem;
}

4.入栈

void push(S *Stack, S *new_elem)//入栈
{
    new_elem->bottom = Stack->bottom;
    Stack->bottom = new_elem;
    Stack->size++;
}

5.出栈

void pop(S *Stack)//出栈,只允许在栈顶操作
{
    Stack->size--;
    S *current = Stack->bottom;
    S *prev = Stack;
    if(Stack->size <= 0){
        printf("栈顶为空,无法出栈");
    }
    else{
        prev->bottom = current->bottom;
        free(current);//此处不能直接free(Stack)!
    }
}

6.获取栈顶元素

int top(S *Stack)//获取栈顶元素
{
    if(Stack->size == 0){
        printf("栈顶为空,无法获取!\n");
        return -1;
    }
    else{
        return Stack->bottom->top_elem;
    }
}

7.打印整个栈内的元素

void Print_Stack(S *Stack)//打印整个栈内的元素
{
    while(Stack->bottom != NULL){
        printf("%d\n↓\n", top(Stack));
        Stack = Stack->bottom;
    }
}

三、代码实现

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

typedef struct Stack{
    struct Stack *bottom;//栈顶指针指向底部
    int size;//栈内元素的个数
    int top_elem;//栈顶元素的值
}S;

S *create_Stack(){
    S *Stack = (S *)malloc(sizeof(S));
    Stack->bottom = NULL;
    Stack->size = 0;
    return Stack;
}

S *create_new_Elem(int data)//创建栈顶元素
{
    S *new_elem = (S *)malloc(sizeof(S));
    new_elem->bottom = NULL;
    new_elem->top_elem = data;
    return new_elem;
}

void push(S *Stack, S *new_elem)//入栈
{
    new_elem->bottom = Stack->bottom;
    Stack->bottom = new_elem;
    Stack->size++;
}

void pop(S *Stack)//出栈,只允许在栈顶操作
{
    Stack->size--;
    S *current = Stack->bottom;
    S *prev = Stack;
    if(Stack->size <= 0){
        printf("栈顶为空,无法出栈");
    }
    else{
        prev->bottom = current->bottom;
        free(current);//此处不能直接free(Stack)!
    }
}

int top(S *Stack)//获取栈顶元素
{
    if(Stack->size == 0){
        printf("栈顶为空,无法获取!\n");
        return -1;
    }
    else{
        return Stack->bottom->top_elem;
    }
}

void Print_Stack(S *Stack)//打印整个栈内的元素
{
    while(Stack->bottom != NULL){
        printf("%d\n↓\n", top(Stack));
        Stack = Stack->bottom;
    }
}

int main()
{
    S *My_stack = create_Stack();
    push(My_stack, create_new_Elem(10));
    push(My_stack, create_new_Elem(20));
    push(My_stack, create_new_Elem(30));
    push(My_stack, create_new_Elem(40));
    push(My_stack, create_new_Elem(50));
    // pop(My_stack);
    // pop(My_stack);
    // pop(My_stack);
    // pop(My_stack);
    // pop(My_stack);
    Print_Stack(My_stack);
    free(My_stack);
    return 0;
}
相关标签: 笔记