当前位置:首页 » 《休闲阅读》 » 正文

C语言数据结构与算法--简单实现栈的出栈与入栈

23 人参与  2024年12月08日 10:01  分类 : 《休闲阅读》  评论

点击全文阅读


目录

(一)栈的基本概念

(二)栈的的表现形式

1.栈的表示和实现

2.栈的链式表示

(三)栈的链式表示时元素压入、弹出 算法实现思路

1.栈的线性链表的压入算法

2.栈的线性链表的弹出算法

(四)算法的实现

(一)栈的基本概念

        栈(Stack)是限定仅在表尾进行插入和删除操作的线性表,如铁路调度。如下 图:

(二)栈的的表现形式

                栈有两种表示形式:栈的表示和实现、栈的 链式表示。

1.栈的表示和实现

利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。如下图:

        同时设置栈顶指针(top)和栈底指针(base)。当 top = base 表示栈空;增加一 个元素,top 增加 1;删除栈顶元素,top 减 1。非空栈顶指针始终在始终在栈顶元素 的下一个位置。

2.栈的链式表示

当栈的长度无法估计时最好用栈的链式表示,如下图所示。

        结点包含数据元素和指针两个数据域。

(三)栈的链式表示时元素压入、弹出 算法实现思路

1.栈的线性链表的压入算法

        压入算法过程为:定义新的结点 p、修改新结 点的指针(指向原栈顶结点 top)、给新结点 p 赋 值为 x、修改新栈顶的指针(指向新结点 p)。

2.栈的线性链表的弹出算法

        弹出算法过程为:将栈顶结点 top 赋给 p、取结点 p 的值并赋给 x、调整栈顶位置(指向结点 p 的下一个结点)、释放结点 p 的空间。

(四)算法的实现

        栈的顺序存储代码表示(已给出具体代码的注释):

#define _CRT_SECURE_NO_WARNINGS  #include <stdio.h>  #include <stdlib.h>  // 定义栈结构体typedef struct {    int data[100];  // 存储栈数据的数组    int top;        // 栈顶指针    int bottom;     // 栈底指针} stack;// 创建栈的函数stack* StackCreate() {    // 开辟存储空间    stack* p = (stack*)malloc(sizeof(stack));    if (p == NULL)        return NULL;  // 如果内存分配失败,返回NULL    p->bottom = -1;  // 初始化bottom为-1,表示栈为空    p->top = -1;     // 初始化top为-1,表示栈为空    return p;}// 入栈函数,在p栈尾插入avoid StackInput(stack* p, int a) {    if (p->top < 99) {        ++(p->top);  // 栈顶指针加一        p->data[p->top] = a;  // 赋值    }    else {        printf("栈的空间不够了!!!\n");    }}// 出栈函数,在p栈尾出栈,并用a来存储int StackOutput(stack* p, int* a) {    if (p->top != -1) {  // 如果栈不为空        *a = p->data[p->top];  // 赋值        (p->top)--;  // 栈顶指针减一        return 1;  // 成功出栈,返回1    }    return 0;  // 栈为空,返回0}// 打印栈中所有元素的函数void Print_function(stack* p) {    for (int i = p->top; i >= 0; i--) {  // 从栈顶到栈底遍历        printf("%d ", p->data[i]);  // 打印栈中的元素    }    printf("\n");}int main() {    int a, n, m;    stack* p = StackCreate();  // 创建栈    if (p == NULL) {        printf("内存分配失败!\n");        return 1;  // 如果创建栈失败,返回1    }    printf("请输入入栈个数:");    scanf("%d", &n);  // 读取入栈的元素个数    for (int i = 0; i < n; i++) {        printf("请输入第%d个数:", i + 1);        scanf("%d", &a);  // 读取用户输入的数字        StackInput(p, a);  // 将数字入栈        printf("入栈后:\n");        Print_function(p);  // 打印当前栈的状态    }    printf("请输入出栈个数:");    scanf("%d", &m);  // 读取出栈的元素个数    for (int i = 0; i < m; i++) {        int element;        if (StackOutput(p, &element)) {  // 将栈顶元素出栈            printf("出栈元素: %d\n", element);  // 打印出栈的元素        }        else {            printf("栈已空,无法出栈!\n");        }    }    printf("出栈后:\n");    Print_function(p);  // 打印当前栈的状态    free(p);  // 释放栈占用的内存    return 0;}

运行结果:

栈的链式存储代码表示(已给出具体代码的注释):

#define _CRT_SECURE_NO_WARNINGS  #include <stdio.h>  #include <stdlib.h>  // 定义链表节点结构体typedef struct Node {    int data;           // 存储的数据    struct Node* next;  // 指向下一个节点的指针} Node;// 定义栈结构体typedef struct {    Node* top;  // 栈顶指针} stack;// 创建栈的函数stack* StackCreate() {    stack* p = (stack*)malloc(sizeof(stack));    if (p == NULL)        return NULL;  // 如果内存分配失败,返回NULL    p->top = NULL;    // 初始化栈顶指针为NULL,表示栈为空    return p;}// 入栈函数,在p栈顶插入avoid StackInput(stack* p, int a) {    Node* new_node = (Node*)malloc(sizeof(Node));    if (new_node == NULL) {        printf("内存分配失败!\n");        return;    }    new_node->data = a;      new_node->next = p->top;  // 新节点的next指针指向当前栈顶    p->top = new_node;  // 更新栈顶指针}// 出栈函数,在p栈顶出栈,并用a来存储int StackOutput(stack* p, int* a) {    if (p->top == NULL) {         return 0;  // 返回0表示失败    }    Node* temp = p->top;  // 临时指针指向栈顶节点    *a = temp->data;        p->top = temp->next;  // 更新栈顶指针    free(temp);           // 释放栈顶节点的内存    return 1;  // 成功出栈,返回1}// 打印栈中所有元素的函数void Print_function(stack* p) {    Node* current = p->top;  // 从栈顶开始遍历    while (current != NULL) {        printf("%d ", current->data);  // 打印栈中的元素        current = current->next;       // 移动到下一个节点    }    printf("\n");}int main() {    int a, n, m;    stack* p = StackCreate();  // 创建栈    if (p == NULL) {        printf("内存分配失败!\n");        return 1;  // 如果创建栈失败,返回1    }    printf("请输入入栈个数:");    scanf("%d", &n);  // 读取入栈的元素个数    for (int i = 0; i < n; i++) {        printf("请输入第%d个数:", i + 1);        scanf("%d", &a);  // 读取用户输入的数字        StackInput(p, a);  // 将数字入栈        printf("入栈后:\n");        Print_function(p);  // 打印当前栈的状态    }    printf("请输入出栈个数:");    scanf("%d", &m);  // 读取出栈的元素个数    for (int i = 0; i < m; i++) {        int element;        if (StackOutput(p, &element)) {  // 将栈顶元素出栈            printf("出栈元素: %d\n", element);  // 打印出栈的元素        }        else {            printf("栈已空,无法出栈!\n");        }    }    printf("出栈后:\n");    Print_function(p);  // 打印当前栈的状态    // 释放栈中所有节点的内存    Node* current = p->top;    while (current != NULL) {        Node* temp = current;        current = current->next;        free(temp);    }    free(p);  // 释放栈结构体的内存    return 0;}

运行结果:

最后。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

听说点赞、收藏加关注的人都能长命千岁,万事如意。。。。。。。。。。。。。。。。。。。。


点击全文阅读


本文链接:http://zhangshiyu.com/post/197974.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1