C++学习---栈的构建及操作
一、顺序栈
- #include <iostream>
- using namespace std;
- #define MAXSIZE 100 //栈的最大容量
- typedef struct {
- int* base;//栈底指针
- int* top;//栈顶指针
- int stacksize;//栈可用的最大容量
- }SqStack;
- void InitStack(SqStack& S) {
- //构造空栈
- S.base = new int[MAXSIZE];
- if (!S.base) exit(OVERFLOW);//存储分配失败
- S.top = S.base;//top初始为base表示为空栈
- S.stacksize = MAXSIZE;
- }
- //入栈
- bool Push(SqStack& S, int e) {
- //插入元素e为新的栈顶元素
- if (S.top - S.base == S.stacksize) return false;//栈满
- *S.top++ = e;//元素e压入栈顶,栈顶指针加1
- return true;
- }
- //出栈
- bool Pop(SqStack& S, int& e) {
- //删除S的栈顶元素,用e返回其值
- if (S.top == S.base) return false;//top=base表示为空栈,返回NULL
- e=*(--S.top);//栈顶指针减1,将栈顶元素赋值给e
- return true;
- }
- //取栈顶元素,返回S的栈顶元素,不修改栈顶指针
- int GetTop(SqStack S) {
- if (S.top != S.base) return *(S.top - 1);//返回栈顶元素的值,栈顶指针不变
- return NULL;
- }
- //判断顺序栈S是否为空栈
- bool isEmpty(SqStack S) {
- if (S.top!=S.base) return false;//不为空返回fasle
- return true;//为空返回true
- }
- //批量入栈
- void StackInput(SqStack& S) {
- int value;
- cout << "请输入入几次栈:";
- cin >> S.stacksize;//用户输入入几次栈
- for (int i = 0; i < S.stacksize; i++) {
- cout << "请输入第" << i + 1 << "个值:";
- cin >> value;
- if (Push(S, value)) cout << "入栈成功!"<<endl;
- else cout << "入栈失败!";
- }
- }
- //依次弹出栈顶元素
- void StackOut(SqStack& S) {
- int value;
- cout << "依次弹出的栈顶元素为:\n";
- while (Pop(S,value))
- {
- cout << value << "\t";
- }
- }
- int main()
- {
- int opearateNum = 0;//操作值
- SqStack S;
- InitStack(S);//初始化堆栈
- while (true)
- {
- cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl;
- cin >> opearateNum;
- if (opearateNum == 5)
- break;
- switch (opearateNum)
- {
- case 1:
- //入栈
- StackInput(S);
- system("pause");
- system("cls");
- break;
- case 2:
- //依次出栈
- StackOut(S);
- system("pause");
- system("cls");
- break;
- case 3:
- //读栈顶元素
- if (!isEmpty(S))cout << GetTop(S) << endl;
- else cout << "堆栈无元素!" << endl;
- system("pause");
- system("cls");
- break;
- case 4:
- //弹出栈顶元素
- int value;//弹出的值
- if (!Pop(S, value)) cout << "堆栈无元素" << endl;
- else cout << "弹出的栈顶元素的值为:" << value << endl;
- system("pause");
- system("cls");
- break;
- default:
- cout << "无效操作,请重新输入!" << endl;
- break;
- }
- }
- }
二、链栈
- #include <iostream>
- using namespace std;
- //链栈的存储结构
- typedef struct StackNode {
- int elem;//栈中的数据元素
- struct StackNode* next;
- }*LinkStack;
- //链栈的初始化
- void InitStack(LinkStack& S) {
- S = NULL;//构造一个空栈S
- }
- //入栈,在栈顶插入元素e
- bool Push(LinkStack &S,int e) {
- StackNode *p = new StackNode;//生成新结点
- p->elem = e;//将新结点p的数据域设置为e
- p->next = S;//将新结点插入栈顶
- S = p;//修改栈顶指针为p
- return true;
- }
- //出栈,删除S的栈顶元素,用第二个参数返回其值
- bool Pop(LinkStack& S, int& e) {
- if (S == NULL) return false;//栈空 返回false
- e = S->elem;//将栈顶元素值赋给e
- StackNode* p = S;//用p临时保存栈顶元素空间,以备释放
- S = S->next;//修改栈顶指针
- delete p;//释放原来的栈顶内存空间
- return true;
- }
- //取栈顶元素,不修改栈顶指针
- int GetTop(LinkStack S) {
- if (S != NULL) return S->elem;//如果栈为非空则返回栈顶元素
- }
- //判断链栈S是否为空栈
- bool isEmpty(LinkStack S) {
- if (S != NULL) return false;//不为空返回fasle
- return true;//为空返回true
- }
- //批量入栈
- void StackInput(LinkStack& S) {
- int value;
- int PushNum;//入栈数
- cout << "请输入入几次栈:";
- cin >> PushNum;//用户输入入几次栈
- for (int i = 0; i < PushNum; i++) {
- cout << "请输入第" << i + 1 << "个值:";
- cin >> value;
- if (Push(S, value)) cout << "入栈成功!" << endl;
- else cout << "入栈失败!";
- }
- }
- //依次弹出栈顶元素
- void StackOut(LinkStack& S) {
- int value;
- cout << "依次弹出的栈顶元素为:\n";
- while (Pop(S, value))
- {
- cout << value << "\t";
- }
- }
- int main()
- {
- int opearateNum = 0;//操作值
- LinkStack S;
- InitStack(S);//初始化堆栈
- while (true)
- {
- cout << "1、批量入栈\t2、全部出栈\t3、读栈顶元素\t4、弹出栈顶元素\t5、退出" << endl;
- cin >> opearateNum;
- if (opearateNum == 5)
- break;
- switch (opearateNum)
- {
- case 1:
- //入栈
- StackInput(S);
- system("pause");
- system("cls");
- break;
- case 2:
- //依次出栈
- StackOut(S);
- system("pause");
- system("cls");
- break;
- case 3:
- //读栈顶元素
- if (!isEmpty(S)) cout << GetTop(S) << endl;
- else cout << "堆栈为空栈!" << endl;
- system("pause");
- system("cls");
- break;
- case 4:
- //弹出栈顶元素
- int value;//弹出的值
- if (!Pop(S, value)) cout << "堆栈为空栈!" << endl;
- else cout << "弹出的栈顶元素的值为:" << value << endl;
- system("pause");
- system("cls");
- break;
- default:
- cout << "无效操作,请重新输入!" << endl;
- break;
- }
- }
- }
C++学习---栈的构建及操作的更多相关文章
- C++学习---队列的构建及操作
一.循环队列 #include <iostream> using namespace std; #define MAXQSIZE 100 typedef struct { int* bas ...
- 深度学习之TensorFlow构建神经网络层
深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...
- 【php学习之路】字符串操作
无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...
- RX学习笔记:JavaScript数组操作
RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
0 前言 本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- jenkins构建后操作添加“Publish to Subversion repository”与Eclipse更新提交SVN文件冲突
jenkins配置环境信息: 1.安装“SVN Publisher plugin”插件: 2.在系统管理-系统设置中“Global SVN Publisher Settings” 填写信息:
随机推荐
- JVM运行时数据区划分
Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳 ...
- C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫 ...
- (专题一)06 MATLAB的算术运算
基本算术运算 乘法运算:A的行数等于B的列数(A,B两矩阵维数和大小相容) 除法运算 逻辑运算 真为1,假为0 优先级,算术运算的优先级最高,逻辑运算的优先级最低,但逻辑非运算是单目运算,他的优先级比 ...
- hw小技巧(转载)
小弟也第一次参加hw,经过5天hw,确实也学到了许多的东西,但就本次分享而言,我分享一些我认为在hw里面值得注意的东西以及一些小技巧 0x01 信息收集 信息收集这个多西当然都是老生常谈了,你收集的东 ...
- Combine 框架,从0到1 —— 5.Combine 提供的发布者(Publishers)
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 提供的发布者(Publishers). 内容概览 前言 Just Future D ...
- luogu2756 飞行员配对方案问题 (裸匈牙利)
匈牙利: 4 81 51 62 53 53 74 54 74 8-1 -1 out:4 #include<iostream> #include<cstdio> #include ...
- Java程序员面试学习资料汇总
整理了一些关于Java程序员面试的书籍及免费资料. 一.书籍篇1)<Offer来了:Java面试核心知识点精讲(原理篇)>精讲Java面试必需的JVM原理.Java基础.并发编程.数据结构 ...
- spark源码分析, 任务反序列化及执行
1 ==> 接受消息,org.apache.spark.executor.CoarseGrainedExecutorBackend#receive case LaunchTask(data) = ...
- 登陆页跳出iframe
1 if(top.location.href != location.href){ 2 top.location.href = location.href; 3 }
- sed: -e expression #1, char 23: unknown option to `s'
语言:bash why? / 作为sed的分隔符,和需要操作的内容有冲突 way? 替换 / 分隔符为 # 或者其他分隔符