顺序栈和链栈是我复习的第二部分,同样是把之前的代码整理出来,发布给大家,实现的方法并不
难,毕竟是最基本的方法嘛。关于代码的解释已经写成注释。所以不用多说了。大家好好看代码吧~
下面的代码是栈的实习,完整代码实现下载地址;
//顺序栈
//
#ifndef ASTACK_H
#defineASTACK_H
#include"Stack.h"
template <classElem> classAStack : publicStack<Elem>{
private:
int size;//栈最大长度
int top;//栈长度
Elem *listArray;
public:
AStack(intsz = DefaultListSize){
size = sz;
top = 0;
listArray = newElem[sz];
}
~AStack(){
delete [] listArray;
}
voidclear(){
top=0;
}
boolpush(constElem& item){//存入操作
if(top==size) returnfalse;
else{
listArray[top++] = item;
returntrue;
}
}
boolpop(Elem& it){//取出操作
if(top==0) returnfalse;
else{
it = listArray[--top];
returntrue;
}
}
booltopValue(Elem& it){//获取栈顶值
if(top==0) returnfalse;
else{
it = listArray[top-1];
returntrue;
}
}
intlength() const{//栈长度
return top;
}
//利用栈将栈逆置
//具体分为以下几步:声明一个变量,用来临时存放栈顶元素,记为A;
//声明一个顺序栈,栈长比原栈小1,记为ls;
//首先将栈顶元素放入A,将剩下的元素放入ls,再将A放入原栈,接着将ls中所有元素放入原栈;
//重复n此,n为栈长;
voidreverlist(){
Elem it;
Elem A;
AStack<Elem> ls(top-1);
for (int i = 0; i < top; i++){
this->pop(A);
while (this->length())
{
this->pop(it);
ls.push(it);
}
this->push(A);
while (ls.length())
{
ls.pop(it);
this->push(it);
}
}
}
};
#endif
//Stack类,定义栈中的方法
//只有五个方法:1、清空;2、进栈;3、出栈;4、获得栈顶元素值;5、输出栈高
#ifndef STACK_H
#defineSTACK_H
#include<iostream>
usingnamespace std;
template <classElem> classStack{
public:
virtualvoidclear() = 0;
virtualboolpush(constElem&) = 0;
virtualboolpop(Elem&) = 0;
virtualbooltopValue(Elem&) = 0;
virtualintlength() const =0;
virtualvoidreverlist() = 0;
};
#endif;
//链式栈的节点
#ifndef SLINK_H
#define SLINK_H
//链栈节点
#include<iostream>
usingnamespace std;
template<classElem> classSLink{
public:
Elem element;
SLink *next;
SLink(constElem& elemval,SLink* nextval = NULL){
element=elemval;
next = nextval;
}
SLink(SLink* nextval =NULL){
next = nextval;
}
};
#endif// ! SLINK_H
//链式栈
#ifndef LSTACK_H
#defineLSTACK_H
#include"Stack.h"
#include"SLink.h"
template <classElem> classLStack : publicStack<Elem>{
SLink<Elem>* top;
int size;//表长度
public:
LStack(){
size = 0;
}
~LStack(){
clear();
}
//清空表
//清空表的操作流程:将top元素一个一个delete掉
voidclear(){
if (size == 0){
cout << "This stack is empty"<<endl;
}
else{
int num = 0;
while (top != NULL&&size>1)
{
SLink<Elem>* temp = top;
top = top->next;
size--;
delete temp;
}
delete top;
size--;
cout << size << endl;
}
}
//入栈
boolpush(constElem& item){
top =newSLink<Elem>(item,top);
size++;
returntrue;
}
//出栈
boolpop(Elem& it){
if(size==0) returnfalse;
else{
it = top->element;
SLink<Elem>* ltemp = top->next;
delete top;
top =ltemp;
size--;
returntrue;
}
}
//获取栈顶值
booltopValue(Elem& it){
if(size == 0)returnfalse;
it = top->element;
returntrue;
}
//获取栈长
intlength() const{
return size;
}
//逆置栈,相关操作可参考顺序表实现
voidreverlist(){
Elem it;
Elem A;
AStack<Elem> ls(size - 1);
for (int i = 0; i < size; i++){
this->pop(A);
while (this->length())
{
this->pop(it);
ls.push(it);
}
this->push(A);
while (ls.length())
{
ls.pop(it);
this->push(it);
}
}
}
};
#endif
相关推荐
压缩包内为栈的工程包;工程包括顺序栈、链栈的类的定义与实现;附适当注释;完全面向对象,类封装;测试类中用(纯)虚函数实现多态。
数据结构课程中顺序栈和链栈的操作实现,实现语言为C语言
顺序栈实现括号配对
采用C++语言实现利用顺序栈、链栈将10进制数转为2、8、16进制数。 通过本编程实例,可以进一步了解到顺序栈和链栈之间区别和联系,体会两者的异同,进一步加深知识印象,是不错的练习素材哦。
注:分为四个内容:顺序栈、链栈、循环队列、链队列。代码由C++程序设计语言编写,包含栈和队列的基本操作(栈:出、入、取、判空等|队列:出、入、取、打印队列、判空等),并展示了三个具体的使用例子,包括用栈求...
顺序栈与链栈的实现
C语言-顺序栈实现十进制转换为二进制-八进制-十六进制
简单的顺序栈的使用 验证 了解一下顺序栈的基本用法
C语言 栈的实现,文章《也没想象中那么神秘的数据结构-后来居上的“栈”》系列示例代码
1、 会定义顺序栈和链栈的结点类型。 2、 掌握双向栈的结构特点及其在一维数组中的实现。 3、 掌握在双向栈中进行插入和删除元素的方法。 二、 实验要求 1、 定义栈的存储结构。 2、 编写程序实现双向栈的基本操作...
数据结构经典算法,汉诺塔问题的求解,C#实现,链栈和顺序栈实现
栈的代码实现(顺序栈链栈)
实现链式栈和顺序栈的定义,分别创建一个栈。
利用顺序栈将一个非负的十进制整数N转换为对应的B进制数。非负的十进制整数N和B都从键盘输入;转换结果从屏幕输出。
设计一个算法,用一个栈s将-一个队列Q逆置: (1)要求采用顺序栈和循环队列来实现。 (2)要求采用链栈和链队列来实现。
自己定义的栈的接口,完全是按照栈的常用方法以及命名方式实现: 注意以下类,接口都是在一个命名空间下 ...顺序栈的实现,参照顺序表实现 namespace 栈 { class SeqStack<T> : IStackDS { pr
用栈实现十进制转换成二进制(c语言)用栈实现十进制转换成二进制(c语言)用栈实现十进制转换成二进制(c语言)
里面7个文件夹,分别是单链表,队列,链队,链栈,排序,顺序表,顺序栈。都实现了插入删除查找等操作,c++代码,可以直接运行。
用c语言实现进制转换,分享给大家,谢谢指导