顺序栈和链式栈(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 ...
随机推荐
- Python 入门介绍
写在前面 开始介绍Python之前, 先回顾一下编译型语言和解释型语言的概念和区别. 计算机能直接识别只能是机器语言, 所以使用高级语言编写的程序必须翻译成机器语言,计算机才能执行. 翻译的方式有两种 ...
- 结构-行为-样式-angularJs ngAnimate(Js实现)
声明 页面 Js 注意事项 官方链接 一.声明 注意animate的版本要与Angular的一致. <script src="jquery.1.9.1.min.js"> ...
- 用浅/深拷贝、和HTML5方法解决js对象的引用的问题
先来看一个例子 例一: var a=[1,2,3]; var b=a; b.push(4); alert(b);//1,2,3,4 alert(a);//1,2,3,4 var a=[1,2,3]; ...
- 将WebApi Host到控制台和IIS
近期学习WebApi,初步感想是用起来很容易上手,概念上也很好理解,唯一不爽的地方就在于如果在Visual Studio环境里建立Webapi程序,它会自动给创建很多文件夹和文件,其中很多都是用不到的 ...
- <span>什么意思
<span> 在CSS定义中属于一个行内元素,在行内定义一个区域,也就是一行内可以被 <span> 划分成好几个区域,从而实现某种特定效果. <span> 本身没有 ...
- Webservice WCF WebApi
注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Service ...
- svn恢复到某一版本
转 经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge 1) 先 svn up,保证更新到最新的版本,如20: 2) 然后用 svn log ,查看 ...
- 报错找不到org.apache,http...的解决办法
在build.gradle中加入 android { useLibrary 'org.apache.http.legacy' }
- matlab中选择图片路径
%读取训练图片数据文件 [FileName,PathName] = uigetfile('*.*','选择测试图片数据文件t10k-images.idx3-ubyte'); %暴露图片路径 saved ...
- css基础和心得(三)
OK!接下来我们分别说这些元素的意义.首先,什么是块级元素?在html中<div>,<p>,<h1>,<form>,<ul>和<li& ...