【数据结构】 顺序栈的基本操作 (C语言版)

这篇具有很好参考价值的文章主要介绍了【数据结构】 顺序栈的基本操作 (C语言版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、顺序栈

1、顺序栈的定义:

2、顺序栈的优缺点

二、顺序栈的基本操作算法(C语言)   

1、宏定义

 2、创建结构体

3、顺序栈的初始化 

4、顺序栈的入栈

5、顺序栈的出栈

6、取栈顶元素

7、栈的遍历输出

8、顺序栈的判空

9、顺序栈的判满

 10、求顺序栈长度

11、顺序栈的清空

12、顺序栈的销毁

13、数制转换

 14、括号匹配

三、顺序栈的基本操作完整代码(C语言)

 四、运行结果


一、顺序栈

1、顺序栈的定义:

顺序栈是由一维数组实现的栈,其中栈底元素的下标为0,栈顶元素的下标为n-1(n为数组大小),栈的大小在创建时确定,且在栈的生命周期内保持不变。

【数据结构】 顺序栈的基本操作 (C语言版),数据结构,c语言,算法

2、顺序栈的优缺点

顺序栈的优点:

  1. 空间利用率高:由于数组的大小在创建时确定,因此可以预先分配足够的空间,避免了频繁的内存申请和释放操作,提高了空间利用率。
  2. 存取速度快:由于栈元素在内存中连续存储,因此可以根据下标直接访问栈底元素和栈顶元素,存取速度快。
  3. 方便进行动态扩展:在某些情况下,可以在栈外再开辟一块内存空间,将栈的大小动态扩展,从而方便处理大规模的数据。

顺序栈的缺点:

  1. 内存浪费:如果预分配的数组大小过大,会造成内存浪费;如果预分配的数组大小过小,则可能会频繁地进行内存申请和释放操作,降低性能。
  2. 不适合处理动态扩展的数据:顺序栈的空间大小在创建时确定,因此无法动态扩展,对于需要处理大规模数据的情况不太适用。
  3. 不便于处理异常情况:如果栈已满而仍需添加元素,会导致栈溢出;如果栈未满而尝试删除元素,会导致栈下溢。这些异常情况的处理较为复杂。

二、顺序栈的基本操作算法(C语言)   

1、宏定义
#define OK 1
#define ERROR 0
#define MAXSIZE 100

typedef char SElemType;
typedef int Status;
 2、创建结构体
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;
3、顺序栈的初始化 
//初始化
Status InitStack(SqStack &S) {
    S.base = new SElemType[MAXSIZE];
    if (!S.base)
        return 0;
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return OK;
}
4、顺序栈的入栈
//进栈
Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base == S.stacksize)
        return 0;
    *S.top++ = e;
    return OK;
}
5、顺序栈的出栈
//出栈
Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base)
        return 0;
    e = *(--S.top);
    return OK;
}
6、取栈顶元素
//获取栈顶元素
Status Top(SqStack &S, SElemType &e) {
    if (S.top == S.base)
        return ERROR;
    e = *(S.top - 1);
    return OK;
}
7、栈的遍历输出
//栈的遍历输出
void printStack(SqStack S) {
    printf("现在栈内元素为:");
    SElemType *p = S.base;
    while (p != S.top) {
        printf("%c ", *p);
        p++;
    }
    printf("\n");
}
8、顺序栈的判空
//判空S.top == S.base
Status StackEmpty(SqStack S) {
    if (S.top == S.base) {
        return true;
    } else {
        return false;
    }
}
9、顺序栈的判满
//判满
Status FullEmpty(SqStack S) {
    if (S.top - S.base == S.stacksize) {
        return true;
    } else {
        return false;
    }
}
 10、求顺序栈长度
//求顺序栈长度
Status StackLength(SqStack S) {
    return S.top - S.base;
}
11、顺序栈的清空
//清空
Status ClearStack(SqStack &S) {
    S.top = S.base;
    return OK;
}
12、顺序栈的销毁

//销毁
Status DestroyStack(SqStack &S) {
    if (S.base) {
        delete S.base;
        S.stacksize = 0;
        S.top = S.base = NULL;
    }
    return OK;
}
13、数制转换
//数制转换
void conversion(int N) {
    SqStack S;
    InitStack(S);
    char e;
    while (N) {
        Push(S, N % 8);
        N = N / 8;
    }
    while (!StackEmpty(S)) {
        Pop(S, e);
        printf("%d", e);
    }
}
 14、括号匹配
//括号匹配
Status Matching() {
    SqStack S;
    InitStack(S);
    SElemType ch, x;
    Status flag = 1;
    printf("请输入需要匹配的括号(以#结束):\n");
    //char ch = getche();
    scanf("%c", &ch);
    while (ch != '#' && flag) {
        switch (ch) {
            case '(':
            case '[':
                Push(S, ch);
                break;
            case ')':
                if (!StackEmpty(S) && GetTop(S) == '(') {
                    Pop(S, x);
                } else {
                    flag = 0;
                }
                break;
            case ']':
                if (!StackEmpty(S) && GetTop(S) == '[') {
                    Pop(S, x);
                } else {
                    flag = 0;
                }
                break;
        }
        //ch = getche();
        scanf("%c", &ch);
    }
    if (StackEmpty(S) && flag) {
        return true;
    } else {
        return false;
    }
}

三、顺序栈的基本操作完整代码(C语言)

#include <stdio.h>
#include <conio.h>//getchae()

#define OK 1
#define ERROR 0

#define MAXSIZE 100

typedef char SElemType;
typedef int Status;

//创建结构体
typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

//初始化
Status InitStack(SqStack &S) {
    S.base = new SElemType[MAXSIZE];
    if (!S.base)
        return 0;
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return OK;
}

//进栈
Status Push(SqStack &S, SElemType e) {
    if (S.top - S.base == S.stacksize)
        return 0;
    *S.top++ = e;
    return OK;
}

//求顺序栈长度
Status StackLength(SqStack S) {
    return S.top - S.base;
}

//出栈
Status Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base)
        return 0;
    e = *(--S.top);
    return OK;
}

//获取栈顶元素
Status Top(SqStack &S, SElemType &e) {
    if (S.top == S.base)
        return ERROR;
    e = *(S.top - 1);
    return OK;
}

//获取栈顶元素
SElemType GetTop(SqStack &S) {
    if (S.top == S.base)
        return ERROR;
    return *(S.top - 1);
}

//栈的遍历输出
void printStack(SqStack S) {
    printf("现在栈内元素为:");
    SElemType *p = S.base;
    while (p != S.top) {
        printf("%c ", *p);
        p++;
    }
    printf("\n");
}

//清空
Status ClearStack(SqStack &S) {
    S.top = S.base;
    return OK;
}

//销毁
Status DestroyStack(SqStack &S) {
    if (S.base) {
        delete S.base;
        S.stacksize = 0;
        S.top = S.base = NULL;
    }
    return OK;
}
//Status DestoryStack(SqStack &S) {
//    if (S.base) {
//        delete S.base;
//        S.stacksize = 0;
//        S.base = S.top = NULL;
//    }
//    return OK;
//}

//判空S.top == S.base
Status StackEmpty(SqStack S) {
    if (S.top == S.base) {
        return true;
    } else {
        return false;
    }
}

//判满
Status FullEmpty(SqStack S) {
    if (S.top - S.base == S.stacksize) {
        return true;
    } else {
        return false;
    }
}

//数制转换
void conversion(int N) {
    SqStack S;
    InitStack(S);
    char e;
    while (N) {
        Push(S, N % 8);
        N = N / 8;
    }
    while (!StackEmpty(S)) {
        Pop(S, e);
        printf("%d", e);
    }
}

//括号匹配
Status Matching() {
    SqStack S;
    InitStack(S);
    SElemType ch, x;
    Status flag = 1;
    printf("请输入需要匹配的括号(以#结束):\n");
    //char ch = getche();
    scanf("%c", &ch);
    while (ch != '#' && flag) {
        switch (ch) {
            case '(':
            case '[':
                Push(S, ch);
                break;
            case ')':
                if (!StackEmpty(S) && GetTop(S) == '(') {
                    Pop(S, x);
                } else {
                    flag = 0;
                }
                break;
            case ']':
                if (!StackEmpty(S) && GetTop(S) == '[') {
                    Pop(S, x);
                } else {
                    flag = 0;
                }
                break;
        }
        //ch = getche();
        scanf("%c", &ch);
    }
    if (StackEmpty(S) && flag) {
        return true;
    } else {
        return false;
    }
}

//功能菜单
Status choice() {
    printf("==================================\n");
    printf("         顺序栈操作功能菜单        \n");
    printf("1、进栈  2、出栈  3、获取栈顶元素   \n");
    printf("4、清空  5、销毁   6、批量进栈     \n");
    printf("7、打印栈内元素     8、数制转换    \n");
    printf("9、括号匹配  10、判空  11、判满    \n");
    printf("12、顺序栈的长度    13退出程序     \n");
    printf("==================================\n");
    return 0;
}

int main() {
    SqStack Sqstack;

    //初始化
    Status rInitStack = InitStack(Sqstack);
    if (rInitStack == OK) {
        printf("顺序栈初始化成功!\n");
    } else {
        printf("顺序栈初始化失败!\n");
    }

    while (1) {

        //功能菜单
        choice();

        int flag;
        printf("请输入所需的功能编号:");
        scanf("%d", &flag);

        switch (flag) {
            case 1: {//进栈
                SElemType Pushdata;
                printf("请输入插入元素(请在英文状态下输入例如:a): \n");
                getchar();
                scanf("%c", &Pushdata);
                Status rPush = Push(Sqstack, Pushdata);
                if (rPush == OK) {
                    printf("向顺序栈进栈%c成功!\n\n", Pushdata);
                } else {
                    printf("向顺序栈进栈失败!\n\n");
                }
            }
                break;
            case 2: {//出栈
                SElemType popData;
                Status rPop = Pop(Sqstack, popData);
                if (rPop == OK) {
                    printf("向顺序栈出栈%c成功!\n\n", popData);
                } else {
                    printf("向顺序栈出栈失败!\n\n");
                }
            }
                break;
            case 3: {//获取栈顶元素
                SElemType topData;
                Status rTop = Top(Sqstack, topData);
                if (rTop == OK) {
                    printf("向顺序栈获取栈顶元素:%c  。\n\n", topData);
                } else {
                    printf("向顺序栈获取栈顶元素失败!\n\n");
                }
                //获取栈顶元素
//                Status rGetTop = GetTop(Sqstack);
//                if (rGetTop == OK) {
//                    printf("向顺序栈获取栈顶元素:%d\n", topData);
//                } else {
//                    printf("向顺序栈获取栈顶元素失败!\n");
//                }
            }
                break;
            case 4: { //清空
                Status rClearStack = ClearStack(Sqstack);
                if (rClearStack == OK) {
                    printf("顺序栈清空成功!\n\n");
                } else {
                    printf("顺序栈清空失败!\n\n");
                }
            }
                break;
            case 5: {//销毁
                Status rDestroyStack = DestroyStack(Sqstack);
                if (rDestroyStack == OK) {
                    printf("顺序栈销毁成功!\n\n");
                } else {
                    printf("顺序栈销毁失败!\n\n");
                }
            }
                break;
            case 6: {//批量插入
                int on;
                printf("请输入想要插入的元素个数:\n");
                scanf("%d", &on);
                SElemType array[on];
                for (int i = 1; i <= on; i++) {
                    getchar();
                    printf("向顺序栈第%d个位置插入元素为:", (i));
                    scanf("%c", &array[i]);
                }

                for (int i = 1; i <= on; i++) {
                    Status rPush = Push(Sqstack, array[i]);
                    if (rPush == OK) {
                        printf("向顺序栈第%d个位置插入元素%c成功!\n", i, array[i]);
                    } else {
                        printf("向顺序栈第%d个位置插入元素%c失败!\n", i, array[i]);
                    }
                }
            }
                break;
            case 7: {//打印栈内元素
                printStack(Sqstack);
            }
                break;
            case 8: {//数制转换
                int N;
                printf("请输入1个非负十进制数:");
                scanf("%d", &N);
                printf("十进制数:%d 。\n", N);
                printf("转换为八进制数为:");
                conversion(N);
                printf("\n");
            }
                break;
            case 9: {//括号匹配
                Status rMatch = Matching();
                if (rMatch == true) {
                    printf("括号匹配成功!\n\n");
                } else {
                    printf("括号匹配不成功!\n\n");
                }
            }
                break;
            case 10: {//判空
                Status rStackEmpty = StackEmpty(Sqstack);
                if (rStackEmpty == true) {
                    printf("顺序栈为空栈!\n\n");
                } else
                    printf("顺序栈不为空!\n\n");
            }
                break;
            case 11: {//判满
                Status rFullEmpty = FullEmpty(Sqstack);
                if (rFullEmpty == true) {
                    printf("顺序栈已满!\n\n");
                } else
                    printf("顺序栈不为满!\n\n");
            }
                break;
            case 12: {//顺序栈的长度
                Status length = StackLength(Sqstack);
                printf("顺序栈的长度为:%d 。\n\n", length);
            }
                break;
            case 13: {//退出程序
                return 0;
            }
                break;
            default: {
                printf("输入错误,无此功能,请检查输入:\n\n");
            }
        }
    }

    return 1;
}

 四、运行结果

【数据结构】 顺序栈的基本操作 (C语言版),数据结构,c语言,算法

【数据结构】 顺序栈的基本操作 (C语言版),数据结构,c语言,算法

【数据结构】 顺序栈的基本操作 (C语言版),数据结构,c语言,算法文章来源地址https://www.toymoban.com/news/detail-820399.html

到了这里,关于【数据结构】 顺序栈的基本操作 (C语言版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】链栈的基本操作(C语言)

    零零总总搜索了一些关于链栈的资料,了解了链栈的基本操作,一直觉得别人写的代码或多或少存在一些问题,所以打算自己写一篇关于链栈的文章,也算是对所学知识的梳理和巩固了。 首先说明本文使用C语言进行链栈的基本操作,链栈是无头结点的。这里补充说明一下,

    2024年02月05日
    浏览(58)
  • 【数据结构】 链栈的基本操作 (C语言版)

    目录 一、链栈 1、链栈的定义: 2、链栈的优缺点: 二、链栈的基本操作算法(C语言)     1、宏定义   2、创建结构体 3、链栈的初始化   4、链栈的进栈 5、链栈的出栈 6、获取栈顶元素 7、栈的遍历输出 8、链栈的判空  9、求链栈的栈长 10、链栈的清空 11、链栈的销毁

    2024年01月24日
    浏览(49)
  • 数据结构学习——C语言对栈的基本操作

             栈(Stack)是一种常用的数据结构,遵循先进后出(LIFO)的原则,对表尾进行操作,常用于临时存储和撤销等操作,其基本操作包括栈的创建、入栈(也叫压栈Push)、出栈(又称弹栈)、栈的遍历、栈的清空(clear)、栈的销毁(destroy)等。         栈的创建有两种方式,一种是通

    2024年02月07日
    浏览(58)
  • 【数据结构】栈和队列(栈的基本操作和基础知识)

    🌈个人主页: 秦jh__ https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》 https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 目录  前言 栈 栈的概念和结构 栈的实现 ​编辑 数组栈的实现 总的声明 初始化  插入 删除 取栈顶元素 销毁 判断是否为空

    2024年02月03日
    浏览(54)
  • 【Java】实现顺序表基本的操作(数据结构)

    在了解顺序表之前我们要先了解什么是线性表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构

    2024年02月03日
    浏览(52)
  • 【数据结构】顺序表基本操作的实现(C语言)

    🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🐌 个人主页:蜗牛牛啊 🔥 系列专栏:🛹数据结构、🛴C++ 📕 学习格言:博观而约取,厚积而薄发 🌹 欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与

    2024年02月16日
    浏览(55)
  • 数据结构教程实验一顺序表基本操作的实现

    1.掌握线性表的顺序存贮结构及基本操作,深入了解顺序表的基本特性,以便在实际问题背景下灵活运用它们。 2.深入理解和灵活掌握顺序表的插入、删除等操作。 1.硬件:每个学生需配备计算机一台。 2.软件:Windows操作系统+Visual C++。     1.将建表、遍历、插入、删除分别

    2024年02月07日
    浏览(45)
  • 数据结构:定长顺序串(SString)基本操作的算法描述(C语言)

    作者在学习数据结构时,发现鲜有完全按照 C 语言描述的算法操作,这让习惯于写 .c 而不是 .cpp 的初学者很是头疼。本文将基于 C 语言描述算法操作,如有错漏还望大佬们指正。 本文将按照严惠敏所著《数据结构(C语言版)》所做的函数原型声明进行算法描述,由于C语言不支

    2024年02月07日
    浏览(72)
  • 数据结构 线性表的定义和基本操作(以顺序表为例)

    名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN) (一个喜欢古诗词和编程的Coder😊) 以下代码个人分享出来,仅供学习交流,且仅在CSDN平台发布,未经授权禁止二次转发。 〇、线性表是什么? 1、定义 线性表 是具有 相同数据类型 的 n(

    2024年02月12日
    浏览(63)
  • 基于C语言的数据结构之顺序表——带你熟练掌握顺序表基本操作!!超级详细!!

    目录 前言: 1.源代码如下 2.数据结构——顺序表    2.1.顺序表的特点    2.2顺序表的分类     2.2.1.动态分配内存的顺序表     2.2.2.静态分配内存的顺序表    2.3.定义一个顺序表 3.顺序表的基本操作    3.1初始化顺序表     不用将顺序表中可能存在的原有元素初始化吗?

    2024年04月26日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包