数据结构之栈的基本操作

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

该顺序栈涉及到了存储整型数据的顺序栈还有存储字符型数据的顺序栈
实现的功能有:入栈、出栈、判断是否为空栈、求栈的长度、清空栈、销毁栈、得到栈顶元素
此外根据上述功能,编写了数值转换(十进制转化八进制)方法、括号匹配方法。

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
#include<iostream>
using namespace std;
#define  STACK_INIT_SIZE  100
#define  STACKINCREMENT  10
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW 0
#define ERROR 0
 
typedef int Status;
typedef char SChar;
typedef int SElemType;
 
//定义栈,栈中存储的数据为整型数据 
typedef  struct
{
    SElemType* base;     //栈底指针
    SElemType* top;      //栈顶指针
    int  stacksize;            //当前已分配的存储空间
}SqStackInt, * SqslinkInt;      //顺序栈说明符
 
//定义栈,栈中存储的数据为字符型数据 
typedef  struct
{
    SChar* base;     //栈底指针
    SChar* top;      //栈顶指针
    int  stacksize;            //当前已分配的存储空间
}SqStackChar, * SqslinkChar;      //顺序栈说明符
 
 
//下面为 “栈中存储的数据为整型数据 ”的基本操作 
Status InitStackInt(SqStackInt& S) {
    //分配内存空间
    S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S.base)exit(OVERFLOW);//分配失败
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;//顺序栈最大的长度
    return OK;
}
//求顺序栈(整形数据)的长度
Status StackIntList(SqStackInt& S) {
    int list = (S.top - S.base);//栈的头指针减去尾指针就是长度
    printf("该顺序栈的长度为:%5d\n", list);
    return OK;
}
//清空顺序栈(整形数据)
Status ClearStackInt(SqStackInt& S) {
    S.top = S.base;
    printf("该整形顺序栈已经清空!");
    return OK;
}
//判断顺序栈(整形数据)是否为空栈
Status StackEmptyInt(SqStackInt S) {
    if (S.base == S.top) {
        printf("该整形顺序栈是空栈!");
        return TRUE;
    }
    else return FALSE;
}
//在顺序栈(整形数据)中得到栈顶元素
SElemType GetTop(SqStackInt& S, SElemType& e) {
    if (S.top == S.base) {
        return ERROR;
    }
    e = *(S.top - 1);//取出栈顶元素
    return OK;
}
//在顺序栈(整形数据)中进栈
Status PushInt(SqStackInt& S, SElemType e) {
    //判断栈是不是满了,如果满了就增加内存空间
    if (S.top - S.base >= S.stacksize) {
        S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base) exit(OVERFLOW);//realloc失败了
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return OK;
 
}
//在顺序栈(整形数据)中出栈
Status PopInt(SqStackInt& S, SElemType& e) {
    if (S.top == S.base) return ERROR;
    e = *--S.top;
   // printf("出栈的元素:%5d\n", e);
    int numer = e;
    return numer;
}
//销毁顺序栈(整形数据)
Status DestroyStackInt(SqStackInt& S) {
    S.stacksize = 0;//销毁后栈的长度为零
    S.top = S.base;
    free(S.base);//释放栈底
    S.top = S.base = NULL;
    printf("该顺序栈已被销毁");
    return OK;
}
 
 
//下面为 “栈中存储的数据为字符型数据 ”的基本操作 
Status InitStackChar(SqStackChar& S) {
    S.base = (SChar*)malloc(STACK_INIT_SIZE * sizeof(SChar));
    if (!S.base)exit(OVERFLOW);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}
 
Status ClearStackChar(SqStackChar& S) {
    S.top = S.base;
    return OK;
}
 
Status StackEmptyChar(SqStackChar S) {
    if (S.base == S.top) return TRUE;
    else return FALSE;
}
 
SChar GetTopChar(SqStackChar& S) {
    SChar e;
    if (S.top == S.base) return ERROR;
    e = *(S.top - 1);
    return e;
}
 
Status PushChar(SqStackChar& S, SChar e) {
    if (S.top - S.base >= S.stacksize) {
        S.base = (SChar*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SChar));
        if (!S.base) exit(OVERFLOW);
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
 
    return OK;
}
 
SChar  PopChar(SqStackChar& S, SChar& e) {
    if (S.top == S.base) return ERROR;
    e = *--S.top;
    char data = e;
    return data;
}
 
 
Status DestroyStackChar(SqStackChar& S) {
    free(S.base);
    return OK;
}
 
//数制转换算法 
void conversion() {
    SqStackInt S;
    InitStackInt(S);
    int N;
    printf("请输入一个数:");
    scanf("%d", &N);
    while (N) {
        PushInt(S, N % 8);//如果N÷8的余数不为零就进栈
        N = N / 8;
    }
    SElemType e;
    while (!StackEmptyInt(S)) {
        PopInt(S, e);//所有余数出栈
        printf("%d", e);
    }
 
} // conversion
 
//括号匹配算法
Status  Matching()
{
    SqStackChar S;
    InitStackChar(S);
    int i =0; 
    char x; 
    ClearStackChar(S);
    SChar E[100];
    printf("请输入一组括号(以#结束):");
    scanf("%s", &E);
    printf("你输入的是:%s\n", E);
    while (E[i] != '#')
    {
        if (E[i] == '(' || E[i] == '[') {
            PushChar(S, E[i]);   //(,[ 进栈
        }
        if (E[i] ==')' || E[i] == ']')
        {
            if (StackEmptyChar(S)) {
                return(ERROR);
            }//不匹配,返回0
            else {
                x = PopChar(S, E[i]);  //出栈,x为相应左括号
                if (x == '(' && E[i] == ']' || x == '[' && E[i] == ')') {                  
                    return(ERROR);
                }
            }    //不匹配返回0
        }
        i++;
       
    }
    if (StackEmptyChar(S))  return(OK);   //括号匹配,返回1
    else return(ERROR);  //不匹配返回0
 
}  //Matching
 
 
int main()
{
    SqStackInt int_S;
    InitStackInt(int_S);//初始化栈
    SElemType enterData_Int;//定义进栈的元素变量,对其赋值
    SElemType outData_Int;//元素出栈用此接受
    int n;//后面要进行的操做数,可以对其赋值
    SElemType e;//定义得到栈顶元素的变量
    int result;
    while (1)
    {
        printf("\n\n\n");
        printf("请从下面菜单中选择要操作的项:\n");
        printf("1、数制转换(十进制转换八进制)\n");
        printf("2、括号匹配\n");
        printf("3、整形数据元素进栈\n");
        printf("4、整形数据元素出栈\n");
        printf("5、求整形顺序栈的长度\n");
        printf("6、清空整形顺序栈\n");
        printf("7、销毁整形顺序栈\n");
        printf("8、判断整形顺序栈是否为空栈\n");
        printf("9、得到整形顺序栈的栈顶元素\n");
        printf("0、退出\n");
        printf("请输入1-9的数或者输入0结束程序:\n");
        scanf("%d", &n);
        switch (n) {
        case 1:
            conversion();
            break;
        case 2:
            result = Matching();
            if (result == OK)
                printf("括号匹配成功\n");
            else
                printf("括号匹配不成功\n");
            break;
        case 3:
            printf("请输入要进栈的整形数据元素:\n");
            scanf("%d", &enterData_Int);
            PushInt(int_S, enterData_Int);
            break;
        case 4:
           /* scanf("%d", &eOut);*/
            int num ;
            num= PopInt(int_S, outData_Int);
            printf("出栈的元素是:%5d\n", num);
           
            break;
        case 5:
            StackIntList(int_S);
            break;
        case 6:
            ClearStackInt(int_S);
            break;
        case 7:
            DestroyStackInt(int_S);
            break;
        case 8:
            StackEmptyInt(int_S);
            break;
        case 9:
            GetTop(int_S,e);
            break;
        case 0:
            exit(0);
            break;
        default:printf("输入数值错误,请重新输入\n"); break;
        }
    }
    return OK;
}

控制台界面展示:
数据结构之栈的基本操作,数据结构学习,数据结构

进栈展示,以进栈三个整形数据元素为例:
数据结构之栈的基本操作,数据结构学习,数据结构

出栈展示:

数据结构之栈的基本操作,数据结构学习,数据结构

数值转换演示,86(十进制数)——>126(八进制):
数据结构之栈的基本操作,数据结构学习,数据结构

括号匹配演示:
数据结构之栈的基本操作,数据结构学习,数据结构文章来源地址https://www.toymoban.com/news/detail-818821.html

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

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

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

相关文章

  • 【数据结构】栈和队列(栈的基本操作和基础知识)

    🌈个人主页: 秦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日
    浏览(42)
  • 数据结构:使用顺序栈的基本操作,实现十进制转为二进制,十六进制的转换

    使用系统环境: 1:win10,使用工具dev 2:使用系统win10 3:参考书籍数据结构(C语言版——严蔚敏 吴伟民) ( 注意:此文章默认,学习者拥有一定的数据机构栈,C语言的知识,书籍第20页,2.1算法的代码进行一个简化。)

    2024年02月05日
    浏览(48)
  • 【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰   目录 ⭐栈的分类 ✨顺序栈 🎈优点: 🎈缺点: ✨链栈 🎈优点: 🎈缺点: ⭐基本概念 ✨栈: ✨栈顶: ✨栈顶: ✨图片理

    2023年04月22日
    浏览(38)
  • 【数据结构】顺序栈的基本操作:出栈、入栈、取栈顶元素、输出所有栈中元素、括号匹配题目

    栈是限定仅在表位进行插入或删除操作的线性表。栈的表尾称为栈顶,表头称为栈底。不含元素的栈称为空栈。 左图为栈的示意图,右图为用铁路调度表示栈。 如下是入栈至栈满再进行出栈的过程示意图。值得注意的是,栈满后,top指针指向的不是顶端元素,而是顶端的下

    2024年02月07日
    浏览(41)
  • 数据结构之栈的实现(附源码)

    目录 一、栈的概念及结构 ​二、栈的实现 三、初学栈的练习题 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插

    2024年02月07日
    浏览(36)
  • 初阶数据结构之栈的实现(五)

    👻作者简介:M malloc,致力于成为嵌入式大牛的男人 👻专栏简介:本文收录于 初阶数据结构 ,本专栏主要内容讲述了初阶的数据结构,如顺序表,链表,栈,队列等等,专为小白打造的文章专栏。 👻相关专栏推荐:LeetCode刷题集,C语言每日一题。 本章我将详细的讲解关于

    2024年02月07日
    浏览(34)
  • 【数据结构】图的基本操作

    一、问题描述 分别以邻接矩阵和邻接表作为存储结构,实现以下图的基本操作: 增加一个新结点v,Insert(G,v); 删除顶点v及其相关的边,Delete(G,v); 增加一条边v,w,Insert(G,v,w); 删除一条边v,w,Delete(G,v,w); 二、设计思路 1、邻接矩阵实现:         邻接矩阵实现图的基本

    2024年02月06日
    浏览(36)
  • 数据结构--串的基本操作

    第五话 数据结构之串 文章目录 一、了解什么是串 二、串的基本特征 三、串的基本操作 串的初始化 串的输出  四、串的匹配模式 五、总结 串(即字符串)是一种特殊的线性表,在信息检索、文本编辑等领域有广泛的应用。其特殊性体现在组成线性表的每个数据元素是单个

    2023年04月17日
    浏览(45)
  • 数据结构--图的基本操作

    使用的存储模式: 图的基本操作: • Adjacent(G,x,y):判断图G是否存在边x, y或(x, y)。 • Neighbors(G,x):列出图G中与结点x邻接的边。 • InsertVertex(G,x):在图G中插入顶点x。 • DeleteVertex(G,x):从图G中删除顶点x。 • AddEdge(G,x,y):若无向边(x, y)或有向边x, y不存在,则向图G中添加该

    2024年02月16日
    浏览(38)
  • (数据结构)链队列的基本操作

    2024年02月08日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包