顺序栈和链式栈(C++实现)
顺序栈,是一种基于数组的存储表示。
链式栈与顺序栈相比有很多优点。当栈需要动态变化时,如果使用顺序栈,如果设置过大会造成很多的资源浪费;如果过小,当栈溢出时,需要开辟一块更大的空间同时将原来栈中的元素全部拷贝过去,造成较大的时间开销。相反,用链接表示可以动态扩充栈的大小;而且可以节约内存空间。
实现类代码如下:
template<class T>
class SeqStack{
T *element;
int top;
int maxSize;
void overflow(){//栈溢出时扩大栈容量
T *newArray=new T[maxSize+];
for(int i=;i<=top;i++){
newArray[i]=element[i];
}
maxSize+=;
delete []element;
element=newArray;
}
public:
SeqStack(int sz=){
top=-;
maxSize=sz;
element=new T[maxSize];
}
~SeqStack(){
delete[] element;
}
void push(const T& x){//进栈
if(isFull())
overflow();
element[++top]=x;
}
bool pop(T& x){//出栈
if(isEmpty())
return false;
x=element[top--];
return true;
}
bool getTop(T& x){//获取栈顶元素
if(isEmpty())
return false;
x=element[top];
return true;
}
bool isEmpty()const{
return (top==-)?true:false;
}
bool isFull()const{
return (top==maxSize-)?true:false;
}
int getSize(){
return top+;
}
void makeEmpty(){//置栈空
top=-;
}
};
测试代码如下:
void menu(){
cout<<"1.进栈"<<endl;
cout<<"2.出栈"<<endl;
cout<<"3.获取栈顶元素"<<endl;
cout<<"4.栈置空"<<endl;
cout<<"5.退出"<<endl;
}
template<class T>
void function(int num,SeqStack<T> *ss){
switch(num){
int x;
case :
cin>>x;
ss->push(x);
break;
case :
ss->pop(x);
break;
case :
ss->getTop(x);
cout<<x<<endl;
break;
case :
ss->makeEmpty();
break;
default:
exit();
}
}
int main(int argc, char** argv) {
SeqStack<int> *ss=new SeqStack<int>;
int num;
while(true){
menu();
cin>>num;
function(num,ss);
}
delete ss;
return ;
}
链式栈,是一种基于链表的存储表示。
实现类代码如下:
template<class T>
struct LinkNode{//链表节点
T data;
LinkNode *link;
LinkNode(const T& args,LinkNode<T> *ptr=NULL){
data=args;
link=ptr;
}
};
template<class T>
class LinkedStack{
LinkNode<T> *top;
public:
LinkedStack(){
top=NULL; }
~LinkedStack(){
makeEmpty();
}
void push(const T& x){//进栈
top=new LinkNode<T>(x,top);
}
bool pop(T& x){//出栈
if(isEmpty())
return false;
LinkNode<T> *p=top;
top=top->link;
x=p->data;
delete p;
}
bool getTop(T& x)const{//返回栈顶元素
if(isEmpty())
return false;
x=top->data;
return true;
}
bool isEmpty()const{
return (top==NULL)?true:false;
}
int getSize()const{
LinkNode<T> *p=top;
int k=;
while(p!=NULL){
p=p->link;
k++;
}
return k;
}
void makeEmpty(){//栈置空
LinkNode<T> *p;
while(top!=NULL){
p=top;
top=top->link;
delete p;
}
}
};
测试代码如下:
void menu(){
cout<<"1.进栈"<<endl;
cout<<"2.出栈"<<endl;
cout<<"3.获取栈顶元素"<<endl;
cout<<"4.栈置空"<<endl;
cout<<"5.退出"<<endl;
}
template<class T>
void function(int num,LinkedStack<T> *ls){
switch(num){
int x;
case :
cin>>x;
ls->push(x);
break;
case :
ls->pop(x);
break;
case :
ls->getTop(x);
cout<<x<<endl;
break;
case :
ls->makeEmpty();
break;
case :
exit();
break;
}
}
int main(int argc, char** argv) {
LinkedStack<int> *ls=new LinkedStack<int>;
int num;
while(true){
menu();
cin>>num;
function(num,ls);
}
delete ls;
return ;
}
顺序栈和链式栈(C++实现)的更多相关文章
- Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- 数据结构:C_顺序栈的实现
数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...
- D_S 顺序栈的基本操作
// main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...
- 数据结构Java实现05----栈:顺序栈和链式堆栈
一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 01顺序栈_Stack---(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- 把十进制整数转换为r(r=2)进制输出(顺序栈实现)
上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1) 初始化顺序栈 2) 实现入栈和出栈操作 3) 实现取栈顶元素 ...
- 数据结构之顺序栈SqStack
顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...
- 顺序栈之C++实现
顺序栈就是用顺序表(数组)实现的栈.其组织形式如下图所示: 下面介绍下我用C++实现的顺序栈,在VC6下调试通过.不足之处还请指正. 1.文件组织 2.ss.h栈类的声明及宏的定义 #ifndef _ ...
- salesforce零基础学习(七十六)顺序栈的实现以及应用
数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...
随机推荐
- BIOS详解:什么是BIOS ?BIOS的作用?CMOS及其与BIOS的关系?
1.什么是BIOS ? BIOS是英文Basic Input Output System的缩略语,直译过来后中文名称就是基本输入输出系统.它的全称应该是ROM-BIOS,意思是只读存储器基本输入输出系 ...
- 深入理解Java Proxy机制(转)
动态代理其实就是java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口(您在参数中传入的接口数组 ...
- 分享下mac安装xamarin跨平台开发环境的坑
之前在vs2015上安装好了xamarin环境,考虑到调试IOS仍然需要mac机,昨天决定直接在mac上安装xamarin. 安装完所有的效果如上图,此时已经可以创建安卓和IOS环境. 我安装过程中, ...
- trie树模板(统计难题)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- 第一百二十九节,JavaScript,理解JavaScript库
JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...
- System.InvalidOperationException: 找到多个与名为“Home”的控制器匹配的类型。
一,当项目中存在多个网站报错,而不是新增Area出现这个错误时.应该在RouteConfig这样改: using System; using System.Collections.Generic; u ...
- trove 开发者阅读翻译
介绍 Trove为OpenStack提供数据库的服务.它的设计运行完全符合OpenStack,目标是让用户能快速.轻松地利用关系数据库的特点,没有负担的处理复杂的管理任务.云用户和数据库管理员可以根据 ...
- NoSQL数据建模技术
原文来自“NoSQL Data Modeling Techniques”,由酷壳网陈皓编译<NoSQL数据建模技术>.这篇文章看完之后,你可能会对NoSQL的数据结构会有些感觉.我的感觉是 ...
- 如何关闭tomcat的localhost_access_log?
Tomcat每处理一个请求就会在{tomcat_home}/logs/下面生成localhost_access_log,日复一日,服务器上面就产生了很多这样的文件,虽然单个文件不大,但是积少成多,一定 ...
- ACM沈化校赛
答对两道题,因为比赛经验原因明明可以对四道,在这两道题又浪费过多时间,成绩不理想,但也是累积了一下经验.