一、顺序栈

  

#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++学习---栈的构建及操作的更多相关文章

  1. C++学习---队列的构建及操作

    一.循环队列 #include <iostream> using namespace std; #define MAXQSIZE 100 typedef struct { int* bas ...

  2. 深度学习之TensorFlow构建神经网络层

    深度学习之TensorFlow构建神经网络层 基本法 深度神经网络是一个多层次的网络模型,包含了:输入层,隐藏层和输出层,其中隐藏层是最重要也是深度最多的,通过TensorFlow,python代码可 ...

  3. 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

    本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...

  4. 【php学习之路】字符串操作

           无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...

  5. RX学习笔记:JavaScript数组操作

    RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...

  6. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  7. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  8. IOS开发-UI学习-sqlite数据库的操作

    IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...

  9. jenkins构建后操作添加“Publish to Subversion repository”与Eclipse更新提交SVN文件冲突

    jenkins配置环境信息: 1.安装“SVN Publisher plugin”插件: 2.在系统管理-系统设置中“Global SVN Publisher Settings” 填写信息:

随机推荐

  1. PJzhang:vulnhub靶机sunset系列SUNSET:TWILIGHT

    猫宁~~~ 地址:https://www.vulnhub.com/entry/sunset-twilight,512/ 关注工具和思路. nmap 192.168.43.0/24靶机IP192.168 ...

  2. 关于弹性布局flex

    什么时候使用flex布局? 当页面排版涉及左右浮动.垂直居中等时,应使用flex布局来避免传统的盒式布局带来的一些Bug. 如何使用flex布局? 在目标元素的父元素设置csss属性.display: ...

  3. Linux安装软件总结

    1.安装jdk1.8 1.首先去官网下载jdk https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  4. Windows批处理(cmd/bat)常用命令学习

    前言 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务.用户只需双击批处理文件便可执行任务,而无需重复输入相同指令.编写批处理文件非常简单,但难点在于确保一切按顺序 ...

  5. 【vue】---- 新版脚手架搭建项目流程详解

    一.概述 本文将介绍vue项目完整的搭建流程,在使用新版本的脚手架基础上,进行了一系列的完善和配置.主要内容如下: 1.项目初始化 安装脚手架 创建项目 项目结构 2.项目搭建配置 引入第三方插件 路 ...

  6. VUE开发(二)nginx配合vue来实现前后端分离部署

    一.引言 由于本地是采用vue+spring boot实现的前后端分离项目,本机启动的时候先启动后场服务,再单独启动vue工程,然后可以实现全流程贯穿,但是我们要部署到服务器上的时候,一般都是打一个j ...

  7. Solon详解(八)- Solon的缓存框架使用和定制

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  8. Python-全局解释器锁GIL原理和多线程产生原因与原理-多线程通信机制

    GIL 全局解释器锁,这个锁是个粗粒度的锁,解释器层面上的锁,为了保证线程安全,同一时刻只允许一个线程执行,但这个锁并不能保存线程安全,因为GIL会释放掉的并且切换到另外一个线程上,不会完全占用,依据 ...

  9. Go-The process cannot access the file because it is being used by another process.

    where? Go程序在读取文件时候 why? 因为有其他进程也在读取和Go程序想要读取的文件,参数冲突 way? 关闭其他程序进程对该文件的读取操作

  10. 日志分析平台ELK之日志收集器logstash常用插件配置

    前文我们了解了logstash的工作流程以及基本的收集日志相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13761906.html:今天我们来了解下l ...