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” 填写信息:
随机推荐
- js之按钮切换
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- JVM内存溢出与内存泄漏
内存溢出与内存泄漏 内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一. 由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃 ...
- Linux实战(13):Ubuntu被远程
此方法采用的xrdp原生方案,优点兼容性比较好. 安装xrdp sudo apt install xrdp #最高权限安装xrdp 修改配置 nano /etc/xrdp/startwm.sh #使用 ...
- ribbon源码之客户端
客户端模块的核心功能是提供统一的用户请求操作接口. 接口定义 客户端模块的核心是IClient接口,定义了客户端网络请求的方法. public interface IClient<S exten ...
- Spring 系列之jdbcTemplate的使用
Spring系列之 jdbcTemplate 啥是jdncTemplate? t他是spring框架中提供的一个对象,是对原始的jdbcAPI对象的简单封装,spring框架为我们提供了很多操作,模板 ...
- Kafka处理请求的全流程分析
大家好,我是 yes. 这是我的第三篇Kafka源码分析文章,前两篇讲了日志段的读写和二分算法在kafka索引上的应用 今天来讲讲 Kafka Broker端处理请求的全流程,剖析下底层的网络通信是如 ...
- Kafka日志段读写分析
引子 之所以写这篇文章是因为之前面试时候被面试官问到(倒)了,面试官说:"你说你对Kafka比较熟?看过源码? 那说说kafka日志段如何读写的吧?" 我心里默默的说了句 &quo ...
- mybatis基础使用
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .20 ...
- Go-archive/tar: write after close gopher.txt
where? 在使用Go中tar包循环写入内容的时候 why? 因为已经关闭了tar.writer对象,所以无法写入,但是程序还是有写入操作,所以报错 way? 通过 defer关键字来管理资源的释放 ...
- 如何安装eclipse
1.打开浏览器输入网址:http://www.eclipse.org 进入官方 2.(目前我使用windows操作系统),下拉界面选择"windows"后的"64-bit ...