当前位置: 首页 > news >正文

C++实现顺序栈和链栈操作(实验3--作业)

顺序栈 

一、主要功能

实现了顺序栈(SqStack)的数据结构,并利用该数据结构进行了栈的基本操作以及数制转换的功能。

二、数据结构定义

  1. 定义了一些常量:
    • MAXSIZE表示栈的最大长度为 100。
    • OVERFLOw表示存储失败的错误码为 -2。
    • OKERROR分别表示操作成功和失败的状态码。
  2. 定义了数据类型:
    • Statusint类型,用于表示操作的状态。
    • SEleTypeint类型,代表栈中存储的数据类型。
  3. 定义了顺序栈结构体SqStack
    • SEleType *base是指向栈内元素数组的指针。
    • SEleType *top是栈顶指针。
    • int stacksize表示当前分配的栈可使用的最大存储容量。

三、函数功能

  1. StackCreate函数:用于初始化顺序栈,为栈分配内存空间,并设置初始状态。
  2. StackEmpity函数:判断栈是否为空。
  3. StackFull函数:判断栈是否已满。
  4. StackPush函数:将元素入栈,如果栈已满则返回错误状态。
  5. StackPop函数:将栈顶元素出栈,并通过引用参数返回该元素,如果栈为空则返回错误状态。
  6. StackToEmpty函数:将栈置空,通过不断出栈操作实现。
  7. StackDestroy函数:销毁栈,释放内存空间。
  8. StackTop函数:获取栈顶元素。
  9. StackPrint函数:打印栈内所有元素,通过不断出栈并输出实现。

四、主函数流程

  1. 首先创建一个顺序栈S并初始化。
  2. 向栈中依次压入数字 5、4、2、3、1,然后打印栈内元素。
  3. 将栈置空。
  4. 进行数制转换功能,用户输入一个数字N和转换的进制数JZ,通过不断对N取余并压入栈中,最后打印转换后的结果。
  5. 销毁栈。
    #include <bits/stdc++.h>
    using namespace std;#define MAXSIZE 100 //最大长度
    #define OVERFLOw -2
    #define OK 1
    #define ERROR 0typedef int Status;
    typedef int SEleType;//数据类型typedef struct {SEleType *base;//栈内元素数组SEleType *top;//栈顶指针int stacksize;  // 当前分配的栈可使用的最大存储容量  
    }SqStack;
    //初始化
    int StackCreate(SqStack &S){S.base = new SEleType[MAXSIZE];if(!S.base) exit(OVERFLOw);//存储失败S.top = S.base;//初始栈里没元素 top = base S.stacksize = MAXSIZE;return OK;//初始化成功
    }
    //栈的判空
    Status StackEmpity(SqStack &S){if(S.top == S.base) return 1;//空else return 0;//非空
    }
    //栈的判满
    Status StackFull(SqStack &S){if(S.top - S.base == S.stacksize) return 1;//满else return 0;//非满
    }
    //入栈
    Status StackPush(SqStack &S,SEleType e){if(StackFull(S)) return ERROR;*S.top++ = e;//等同于数组赋值后 下标++return OK;
    }
    //出栈
    Status StackPop(SqStack &S,SEleType &e){if(StackEmpity(S)) return ERROR;//栈空//用e接收栈顶元素e = *(--S.top);//top 指向的是栈顶的上方return OK;
    }
    //栈的置空
    Status StackToEmpty(SqStack &S) {SEleType temp;while (!StackEmpity(S)) {StackPop(S, temp);}return OK;
    }
    //栈的销毁
    Status StackDestroy(SqStack &S){delete[] S.base;S.base = NULL;S.top = NULL;S.stacksize = 0;return OK;
    }
    //取栈顶元素
    SEleType StackTop(SqStack &S){return *(S.top-1);
    }
    //打印栈内所有元素
    void StackPrint(SqStack &S){while(!StackEmpity(S)){SEleType e;StackPop(S,e);cout<<e<<" ";}
    }
    int main(){SqStack S ;StackCreate(S);StackPush(S,5);StackPush(S,4);StackPush(S,2);StackPush(S,3);StackPush(S,1);StackPrint(S);StackToEmpty(S);//数制转换int N;cout<<"\n输入要转换的数字: ";cin>>N; int T = N;int JZ;cout<<"转换为几进制(<10): ";cin>>JZ;while(N){StackPush(S,N%JZ);N/=JZ;}cout<<"10 进制数: "<<T<<"在"<<JZ<<"进制转换后是 "<<endl;StackPrint(S);StackDestroy(S);return 0;
    }

    链栈

一、主要功能

实现了链式栈(LinkStack)的数据结构,并利用该数据结构进行了栈的基本操作以及数制转换的功能。

二、数据结构定义

  1. 定义了一些常量:
    • MAXSIZE表示栈的最大长度为 100(但在链式栈中未实际用到该常量)。
    • OVERFLOw表示存储失败的错误码为 -2(未实际用到)。
    • OKERROR分别表示操作成功和失败的状态码。
  2. 定义了数据类型:
    • Statusint类型,用于表示操作的状态。
    • LEleTypeint类型,代表栈中存储的数据类型。
  3. 定义了链式栈的节点结构体StackNode
    • LEleType data表示节点存储的数据。
    • struct StackNode *next指向下一个节点的指针。
    • StackNode是节点结构体的名称,*LinkStack是指向节点的指针类型别名,用于表示链式栈。

三、函数功能

  1. StackCreate函数:用于初始化链式栈,将栈顶指针置为NULL
  2. StackEmpty函数:判断链式栈是否为空。
  3. StackPush函数:创建一个新节点,将新节点的数据域设置为给定元素,然后将新节点插入到栈顶(即让新节点的next指向当前栈顶,然后更新栈顶指针为新节点)。
  4. StackPop函数:如果栈不为空,将栈顶元素出栈,通过引用参数返回该元素,并释放栈顶节点的内存空间,更新栈顶指针指向下一个节点。
  5. StackTop函数:获取栈顶元素的值,但不修改栈的状态。
  6. StackToEmpty函数:通过不断出栈操作将链式栈置空。
  7. StackDestroy函数:调用StackToEmpty函数将栈置空后,将栈顶指针置为NULL,实现栈的销毁。
  8. StackPrint函数:通过不断出栈并输出元素的方式打印链式栈中的所有元素,但这个过程会破坏栈的结构。

四、主函数流程

  1. 首先创建一个链式栈S并初始化。
  2. 向栈中依次压入数字 5、4、2、3、1,然后打印栈内元素(这会破坏栈的结构)。
  3. 将栈置空。
  4. 进行数制转换功能,用户输入一个数字N和转换的进制数JZ,通过不断对N取余并压入栈中,最后打印转换后的结果(同样会破坏栈的结构)。
  5. 销毁栈。
#include <bits/stdc++.h>
using namespace std;#define MAXSIZE 100 //最大长度
#define OVERFLOw -2
#define OK 1
#define ERROR 0typedef int Status;
typedef int LEleType;//数据类型typedef struct StackNode{ LEleType  data; struct StackNode *next; 
} StackNode,*LinkStack; 
//栈的初始化
Status StackCreate(LinkStack &S){S = NULL;return OK;
}
//栈的判空
Status StackEmpty(LinkStack &S){if(!S) return 1;//空else return 0;//非空
}
//入栈
Status StackPush(LinkStack &S,LEleType e){StackNode * p = new StackNode; //新节点p->data = e; //新节点的数据域p->next = S; //新节点压入栈顶S = p; //修改栈顶指针为preturn OK;
}
//出栈
Status StackPop(LinkStack &S,LEleType &e){if(StackEmpty(S)) return ERROR;e = S->data;StackNode * p = S; //新节点S = S->next;delete p;return OK;
}
//获取栈顶元素
LEleType StackTop(LinkStack &S){LEleType e = S->data;return e;
}
//栈的置空
void StackToEmpty(LinkStack &S){while(!StackEmpty(S)){LEleType e;StackPop(S,e);}
}
//栈的销毁
void StackDestroy(LinkStack &S) {StackToEmpty(S);S = NULL;
}
//打印所有元素(破坏了栈)
void StackPrint(LinkStack &S){StackNode * p = S;while(!StackEmpty(S)){LEleType e;StackPop(S,e);cout<<e<<" ";p = p->next;}
}
using namespace std;
int main(){LinkStack S;StackCreate(S);StackPush(S,5);StackPush(S,4);StackPush(S,2);StackPush(S,3);StackPush(S,1);StackPrint(S);StackToEmpty(S);//数制转换int N;cout<<"\n输入要转换的数字: ";cin>>N; int T = N;int JZ;cout<<"转换为几进制(<10): ";cin>>JZ;while(N){StackPush(S,N%JZ);N/=JZ;}cout<<"10 进制数: "<<T<<"在"<<JZ<<"进制转换后是 "<<endl;StackPrint(S);StackDestroy(S);return 0;
}

运行结果图如下

http://www.lryc.cn/news/465162.html

相关文章:

  • 龙兴物联一体机:设备监测的智能先锋
  • KinectDK相机SDK封装Dll出现k4abt_tracker_create()创建追踪器失败的问题
  • Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)
  • 高速缓冲存储器Cache是如何工作的、主要功能、高速缓冲存储器Cache和主存有哪些区别
  • 极简版Java敏感词检测SDK
  • H3C路由器交换机操作系统介绍
  • 【项目案例】-音乐播放器-Android前端实现-Java后端实现
  • EasyX图形库的安装
  • 数据结构 - 队列
  • 基于springboot美食推荐商城的设计与实现
  • React开发一个WebSocket
  • Oracle DECODE 丢失时间精度的原因与解决方案
  • 如何用示波器检测次级点火系统(一)
  • 基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)
  • bmp怎么转换为jpg?快速批量将bmp转换为jpg
  • centos8配置java环境变量jdk8u422-b05
  • 基于SSM的校园拓展活动管理系统
  • Python随机森林算法详解与案例实现
  • 提示词高级阶段学习day2.1-在提示词编写中对{}的使用教程
  • 2024年,每一个大模型都躲不过容嬷嬷和紫薇
  • SpringBoot之RedisTemplate基本配置
  • SparseRCNN 模型,用于目标检测任务
  • 【AIGC】第一性原理下的ChatGPT提示词Prompt设计:系统信息与用户信息的深度融合
  • DeepSpeed性能调优与常见问题解决方案
  • 【GESP】C++一级练习BCQM3052,鸡兔同笼
  • Android面试之5个性能优化相关的深度面试题
  • R语言机器学习算法实战系列(六)K-邻近算法 (K-Nearest Neighbors)
  • FPGA图像处理之构建3×3矩阵
  • 【Linux】进程间通信(匿名管道)
  • memset()函数的实现