当前位置: 首页 > news >正文

创建一个顺序栈,并实现基础的“出栈入栈”功能(C++版)

1. 栈(stack)

1. 栈:只允许在一端进行插入、删除的线性数据结构。允许插入和删除的一端叫做栈顶, 另一端叫做栈底,栈的特点是:先进后出

2. 栈分为顺序栈和链式栈,顺序栈占用一片连续存储空间进行操作,链式栈则是分散存储,本文主要介绍顺序栈的使用

3. 这里我们用C++中的来实现数据结构,我们准备三个文件:stack.h、stack.cpp、main.cpp

2. 栈的功能实现

栈的功能函数中不仅有 “ 出栈入栈 ” 还有一系列辅助实现功能的函数——判空、判满、清空、回收、求有效数据长度、显示栈元素的函数

(1)stack.h

在头文件中,我们定义一个栈类,将栈的属性定义成类的成员属性,栈的功能函数定义为类的成员函数

类的构造函数和析构函数刚好可以对应栈的创建和销毁

#ifndef _stack_h_
#define _stack_h_#include <cstring>
#include <assert.h>
#include <iostream>
using namespace std;typedef int data_t; class Stack
{private:int *data; //栈空间首地址 int size; //栈的大小 int top; //栈顶指针 public:	//创建顺序栈Stack(int size = 10);Stack(const Stack &obj);//回收栈~Stack();	//判空bool stack_empty(); //判满bool stack_full();//清空栈void stack_clear();//获取栈的长度int stack_length();//显示栈的数据void stack_display();//入栈bool stack_push(data_t value);//出栈data_t stack_pop();//获取栈顶元素data_t stack_top();
};#endif

(2)stack.cpp

在cpp文件中封装类的功能函数(配合注释更易理解代码)

#include "stack.h"//创建顺序栈
Stack :: Stack(int num) : size(num)
{assert(size > 0);data = new int [size];memset(data, 0, sizeof(int)*size);top = -1; //初始化栈顶指针 
}
//拷贝构造函数 
Stack :: Stack(const Stack &obj)
{size = obj.size;data = new int[size]; //深拷贝 memcpy(data, obj.data, size*sizeof(int)); //复制数据 top = obj.top;
}
//回收栈
Stack :: ~Stack() 
{delete [] data; 
}//判空
bool Stack :: stack_empty()
{if(-1 == top)return true;return false;
} //判满
bool Stack :: stack_full()
{if (size - 1 == top)return true;return false;
}//清空栈
void Stack :: stack_clear()
{top = -1; 
}//获取栈的长度
int Stack :: stack_length()
{return (top + 1);
}//遍历栈的数据
void Stack :: stack_display()
{for(int i = 0; i <= top; i++)cout << data[i] << "  ";cout << endl;
}//入栈
bool Stack :: stack_push(data_t value)
{//判满if (stack_full()){cout << "Stack is full! Push failed!" << endl;return false;}//有效元素+1top += 1;//插入数据data[top] = value;return true;
}//出栈
data_t Stack :: stack_pop()
{//判空if (stack_empty()){cout << "Stack is empty! Pop failed!" << endl;return -1;}//记录栈顶元素data_t value = data[top];//有效元素-1top -= 1;//返回已删除的栈顶数据return value;
}//获取栈顶元素
data_t Stack :: stack_top()
{//判空if (stack_empty()){cout << "Stack is empty! Pop failed!" << endl;return -1;}//返回栈顶元素return data[top];
}

(3)main.cpp

我们在主函数中简单验证栈的功能

如果在类中自定义了构造函数和析构函数,那么创建对象时编译器会自动调用自定义的版本,就不会使用默认生成的了

#include <iostream>
#include "stack.h"int main(int argc, char** argv) {Stack obj;//插入十个数(入栈)cout << "插入十个数:" << endl;int i = 0;while(i++ < 10)obj.stack_push(i);//展示插入数据后的栈obj.stack_display();//出栈cout << "出栈操作,出栈的元素为:" << obj.stack_pop() << endl;cout << "遍历栈:" << endl;obj.stack_display();//获取栈顶元素cout << "栈顶元素为:" << obj.stack_top() << endl;return 0;
}

(4)运行结合展示

3. 总结

1. 栈的先进后出是它独有的特点,可运用在实现递归、表达式求值等方面。

2. 栈也是线性数据结构的一种,另外线性数据结构还包括线性表(顺序表、链表)、队列,它们各有各的特色,如想了解其他线性结构的使用,欢迎浏览主页相关文章!

感谢观看!如有疑问欢迎提出!

  ----香菜小猫祝这位uu天天开心----

http://www.dtcms.com/a/439091.html

相关文章:

  • 定制手机壳的网站广州冼村旧改最新消息
  • 怎么做淘宝客网站备案网站后台的形成
  • wordpress安装后查看站点失败河北平台网站建设
  • 网站专题页制作网站备案关闭影响排名
  • Python Flask框架深度解析:从入门到高级
  • 网站销售的优势生鲜做的好的网站
  • 中企动力做的网站怎么登陆运城市住房与城乡建设厅网站
  • 香橙派RK3588s部署大模型
  • 【自记】数据开发中分区表、事务表、分区事务表:特性相似处与区别
  • ATMS课程管理系统 - 从零构建的MySQL实战之旅
  • 广东东莞自己建站教程做网站设计的公司叫什么
  • 网站站外引流怎么做西安动力无限网站建设
  • 智能交通顶刊TITS论文分享|一种可以提高车辆轨迹预测精度和稳定性的稀疏时空Transformer模型
  • 福州专业网站设计团队seo排名优化公司
  • 进入WSL2 Ubuntu环境的完整指南
  • 龙岗网站建设公司效果河南建筑官网首页
  • 网站前置审批怎么进网站源码的后台
  • 电商网站建设考试题网站头部优化文字怎么做
  • php做网站有哪些好处界面官方网站
  • perror与stderr:错误处理的“诊断专家“与“急诊通道“
  • 小公司做网站需要什么条件绿茶直播
  • import-route direct 概念及题目
  • K230基础-图像绘制
  • 鲜花网站设计php 企业网站 后台图片上传
  • 帮人做非法网站oa信息化管理系统平台
  • 君正T32开发笔记之固件烧写
  • MCP模型上下文协议实战:使用TKinter构建桌面AI助手
  • 网络培训视频如何快速完成网站优化托管方案文库
  • 从0-1建设数据仓库
  • 【玩泰山派】4、制作ubuntu镜像-(5)总结制作镜像流程