顺序栈,是一种基于数组的存储表示。

  链式栈与顺序栈相比有很多优点。当栈需要动态变化时,如果使用顺序栈,如果设置过大会造成很多的资源浪费;如果过小,当栈溢出时,需要开辟一块更大的空间同时将原来栈中的元素全部拷贝过去,造成较大的时间开销。相反,用链接表示可以动态扩充栈的大小;而且可以节约内存空间。

  实现类代码如下:

  

 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++实现)的更多相关文章

  1. Java的顺序栈和链式栈

    栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...

  2. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  3. D_S 顺序栈的基本操作

    //  main.cpp #include <iostream> using namespace std; #include "Status.h" typedef in ...

  4. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  5. 01顺序栈_Stack---(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...

  6. 把十进制整数转换为r(r=2)进制输出(顺序栈实现)

    上周的第二个作业补上~~ 上周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素 ...

  7. 数据结构之顺序栈SqStack

    顺序栈SqStack 基本操作 Status InitStack()//构造一个空栈S Status DestroyStack()//销毁栈S,S不再存在 Status ClearStack()//把 ...

  8. 顺序栈之C++实现

    顺序栈就是用顺序表(数组)实现的栈.其组织形式如下图所示: 下面介绍下我用C++实现的顺序栈,在VC6下调试通过.不足之处还请指正. 1.文件组织 2.ss.h栈类的声明及宏的定义 #ifndef _ ...

  9. salesforce零基础学习(七十六)顺序栈的实现以及应用

    数据结构中,针对线性表包含两种结构,一种是顺序线性表,一种是链表.顺序线性表适用于查询,时间复杂度为O(1),增删的时间复杂度为O(n).链表适用于增删,时间复杂度为O(1),查询的时间复杂度为O(n ...

随机推荐

  1. is和as关键字

    c# 中 is和as 操作符是用来进行强制类型转换的 is : 检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,永远不会抛出异常 object o = new object(); if ( ...

  2. for循环和while循环

    for循环和while循环 --道心 for循环 name1_list=['daoxin','wuxin','zhixin']for ele in name1_list: #找到"wuxin ...

  3. USACO 3.3 A Game

    A GameIOI'96 - Day 1 Consider the following two-player game played with a sequence of N positive int ...

  4. D3.js:饼状图的制作

    假设有如下数据需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终止角度, ...

  5. 利用Hibernate监听器实现用户操作日志

    网上搜索发现,实现用户操作日志的方式有:自定义注解方式.Hibernate拦截器方式.Hibernate监听器方式等. 1.自定义注解方式较为麻烦,需要进行操作记录的方法均需要添加注解,但是相对的操作 ...

  6. PopupWindow 的使用

    //contentView : 气泡显示的内容 //width ,height : 宽高 PopupWindow popupWindow = new PopupWindow(contentView, ...

  7. C#中的重写和覆盖的区别

    #中重写(override)和覆盖(new)的区别 重写用关键字 virtual 修饰的方法,叫虚方法.可以在子类中用override 声明同名的方法,这叫“重写”.相应的没有用virtual修饰的方 ...

  8. mybatis学习笔记一(入门)

    昨天看了一下mybatis,学习了一下有很多东西还不懂,但是想把一些知道的记录一下,如有错误请大家多多指点. mybatis它是apche的一个开源项目,它以前的没名字并不是叫mybatis而是叫ib ...

  9. ArrayList构造函数

    //1.摘要: //初始化 System.Collections.ArrayList 类的新实例,该实例为空并且具有默认初始容量. // public ArrayList(); ArrayList a ...

  10. NOIP2014-提高组初赛C语言解析(选择填空题)

    第二十届全国青少年信息学奥林匹克联赛初赛 一.单项选择题(共 20 题,每题 1.5 分,共计 30 分.每题有且仅有一个正确选项) 1. 以下哪个是面向对象的高级语言( B ) A.汇编语言   B ...