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” 填写信息:
随机推荐
- 分布式系统监视zabbix讲解七之分布式监控
分布式监控 概述 Zabbix通过Zabbix proxy为IT基础设施提供有效和可用的分布式监控 代理(proxy)可用于代替Zabbix server本地收集数据,然后将数据报告给服务器. Pro ...
- 堆的源码与应用:堆排序、优先队列、TopK问题
1.堆 堆(Heap))是一种重要的数据结构,是实现优先队列(Priority Queues)首选的数据结构.由于堆有很多种变体,包括二项式堆.斐波那契堆等,但是这里只考虑最常见的就是二叉堆(以下简称 ...
- Linux初步了解
文件系统类型:swap分区:用于内存扩充,用磁盘兑换,磁盘是内存的两倍,便于替换 / 分区:容纳根文件系统 文件名:由字母,数字,下划线,圆点组成 文件类型:显示在每一行的左边第一个字符 普通文件 ...
- 将SublimeText3打造成简易Java IDE
简介与优点 使用该教程,你能使你的Sublime Text3可以作为一个精简版的JAVA IDE工具 既可以独立在cmd控制台运行也可以在Sublime自带的控制台运行 运行后不会有乱码 报错后可以在 ...
- Kafka索引设计的亮点
前言 其实这篇文章只是从Kafka索引入手,来讲述算法在工程上基于场景的灵活运用.单单是因为看源码的时候有感而写之. 索引的重要性 索引对于我们来说并不陌生,每一本书籍的目录就是索引在现实生活中的应用 ...
- Redis小记(一)
1.redis的数据结构 (1)动态字符串(SDS) redis自身构建了一个简单动态字符串的抽象类型,SDS,在redis里,包含字符串的键值对在底层都是由SDS来实现的. 除了用来保存数据库的字符 ...
- Dynamically allocated memory 动态分配内存【malloc】Memory leaks 内存泄漏
内存泄露Memory leaks :没有指针指向原来a分配出来的那段空间了
- 解决SpringBoot项目创建缓慢问题
SpringBoot项目构建缓慢 快速创建springboot项目 在创建一个springboot项目的时候,往往速度会很慢,原因是下载springboot文件的默认地址是springboot官网(国 ...
- javaagent+asm破解censum
内容介绍 最近在学习字节码相关知识,了解到通过ASM字节码改写技术来做破解一些软件破解,非常感兴趣,本文记录一下破解 Censum的过程(仅个人学习使用). 之前也写过一篇暴力破解Censum的文章, ...
- docker-命令帮助
1. 命令参考 http://www.runoob.com/docker/docker-command-manual.html2. docker-命令,可以使用docker --help查看或 ...