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” 填写信息:
随机推荐
- Combine 框架,从0到1 —— 4.在 Combine 中使用 KVO
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用 KVO. 内容概览 前言 用 KVO 监控改动 将 KVO 代 ...
- Docker网络(五)
本章内容 1.dokcer默认自带的几种网络介绍 2. 自定义网络 3. 容器间通信 4. 容器与外界交互 docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网 ...
- 2.BlockingQueue-阻塞式队列
- Gradle系列之从零搭建Maven私服库
原文发于微信公众号 jzman-blog,欢迎关注交流. 前面几篇文章学习了 Gradle 相关知识,Gradle 系列文章如下: Gradle系列之初识Gradle Gradle之Groovy基础篇 ...
- Redis5设计与源码分析读后感(四)压缩列表
一.引言 上一节我们总结了跳跃表的知识,我们知道了有序数组可以用跳跃表实现,也可以用压缩列表来实现,这一篇文章我们来总结一下压缩列表相关的知识. 二.压缩列表简介 定义:压缩列表 ziplist 本质 ...
- 码云+Git配置仓库
版本库Git安装 概述 Git是一个开源的分布式控制系统,可以有效高速的处理从很小的到非常大的项目版本管理,是目前使用范围最广的版本管理工具. 下载安装 下载后傻瓜式一键安装,建议安装在英文目录下,安 ...
- 手撸Mysql原生语句--单表
select from where group by having order by limit 上面的所有操作是有执行的优先级的顺序的,我们将执行的过程可以总结为下面所示的七个步骤. 1.找到表:f ...
- 搭建 Spring 源码阅读环境
前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...
- Centos-检查文件系统并尝试修复-fsck
fsck 检查文件系统并尝试修改错误,修复对象为设备,本质上是调用 /sbin/fsck.filesystemName 命令, filesystemName是指定设备的文件系统类型,如图分区中有文件丢 ...
- CentOS7的下载及虚拟机的创建
一.CentOS的安装 1,首先打开开源镜像网站:www.mirrors.163.com(网易开源镜像网站),www.mirrors.aliyun.com(阿里云开源镜像网站) 以网易为例 2.点击进 ...