链栈(C++)
链栈,字面意思,就是用链表来实现一个栈的数据结构。
那么,只需将单链表的头节点当作栈顶,尾节点当作栈底。入栈只需要头插,出栈只需头删即可。所以只需要吧单链表稍微阉割一下就可以得到链式栈了。代码如下
//header.h
#pragma once
#include<iostream>
using namespace std;
template<class T>
struct LinkNode //节点类定义
{
T data; //数据域
LinkNode<T> *next; //链指针域
LinkNode(LinkNode<T> *ptr = NULL){this->next = ptr;} //初始化指针域的构造函数
LinkNode(const T& item, LinkNode<T> *ptr = NULL)//初始化数据成员和指针成员和指针的构造函数
{
this->data = item;
this->next = ptr;
}
}; template<class T>
class ListStack //用头结点的数据域表示链表元素数量
{
protected:
LinkNode<T> *first;
public:
ListStack(){first = new LinkNode<T>;first->data = 0;}//无参数构造
ListStack(const T& x)
{
this->first = new LinkNode<T>;
this->input(x);
}//含有参数的构造函数
ListStack(ListStack<T>& L);//拷贝构造
~ListStack(){makeEmpty();}//析构函数
void makeEmpty();//将链表置空的函数
int Length()const{return this->first->data;}//计算链表长度的函数
LinkNode<T>* getHead()const{return this->first;}//返回附加头结点地址
LinkNode<T>* getRear()const;//返回尾部指针
void input(T head);//头插
void output();//将链表打印出来
bool IsEmpty()const{return !this->first->data;}
bool Remove(int i, T& x);//删除第i个元素,将第i个元素的data赋值给x
ListStack<T>& operator=(ListStack<T>& L);//符号重载,赋值
bool del(T& x); };
template<class T>
bool ListStack<T>::del(T& x)
{
return this->Remove(1, x);
}
template<class T>
ListStack<T>& ListStack<T>::operator=(ListStack<T>& L)
{
if(!L.IsEmpty())
{
LinkNode<T> *srcptr = L.first, *desptr = this->first;
while(srcptr->next != NULL)
{
desptr->data = srcptr->data;
desptr->next = new LinkNode<T>;
srcptr = srcptr->next;
desptr = desptr->next;
}
desptr->data = srcptr->data;
}
}
template<class T>
bool ListStack<T>::Remove(int i, T& x)
{
if(i>0 && i<=this->first->data)
{
LinkNode<T> *tmp = this->first, *p;
if(i!=1)
{
int j = 0;
while(j!=i-1)
{
tmp = tmp->next;
++j;
}
p = tmp->next;
tmp->next = p->next;
x = p->data;
delete p;
}
else
{
p = tmp->next;
x = p->data;
tmp->next = p->next;
delete p;
}
--this->first->data;
return true;
}
return false;
} template<class T>
void ListStack<T>::input(T head)
{
LinkNode<T> *tmp = new LinkNode<T>;
if(tmp == NULL)
{
cerr<<"内存分配错误!\n"<<endl;
exit(-1);
} if(this->first->next != NULL)
{
tmp->next = this->first->next;
this->first->next = tmp;
}
else
{
this->first->next = tmp;
tmp->next = NULL;
}
tmp->data = head;
++this->first->data; }
template<class T>
void ListStack<T>::output()
{
LinkNode<T> *p = this->first->next;
while(p!=NULL)
{
cout<<p->data<<" | ";
p = p->next;
}
cout<<"over"<<endl;
}
template<class T>
ListStack<T>::ListStack(ListStack<T>& L)
{
T value;
LinkNode<T> *srcptr = L.getHead();
LinkNode<T> *desptr = this->first = new LinkNode<T>;
this->first->data = srcptr->data;
while(srcptr->next != NULL)
{
value = srcptr->next->data;
desptr->next = new LinkNode<T>(value);
desptr = desptr->next;
srcptr = srcptr->next;
}
desptr->next = NULL;
}
template<class T>
void ListStack<T>::makeEmpty()
{
LinkNode<T> *p, *q = this->first->next;
this->first->data = 0;
while(q != NULL)
{
p = q;
q = q->next;
delete p;
}
}
template<class T>
LinkNode<T>* ListStack<T>::getRear()const
{
LinkNode<T> *p = this->first;
while(p->next!=NULL)
p = p->next;
return p; }
#include"header.h" int main()
{
int x = 0;
ListStack<int> LS;
for(int i=0; i<=7; ++i)
LS.input(i);
LS.output();
for(int i=0; i<=2; ++i)
{
LS.del(x);
cout<<x<<" ";
}
cout<<endl;
LS.output(); return 0;
}
运行结果
还行,这里补充一个vim将字符批量替换的命令
在vim末行模式下
a,b s#words1#words2#g
从第a行到第b行,将所有words1替换为words2
试了一下
命令是将第六行到第七行的所有i替换成io,替换后
替换后下边有提示在多少行替换了多少个(Emma,替换前的图i没有圈完,眼花眼花)
链栈(C++)的更多相关文章
- 03链栈_LinkStack--(栈与队列)
#include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...
- 从零开始学C++之数据封装与抽象:分别用C和C++来实现一个链栈
下面通过分别用C和C++来实现一个链栈(链表实现),从中体会数据封装抽象的思想: C语言实现: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- java与数据结构(6)---java实现链栈
栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...
- 链栈之C++实现
链栈是借用单链表实现的栈.其不同于顺序栈之处在于: 1.链栈的空间是程序运行期间根据需要动态分配的,机器内存是它的上限.而顺序栈则是 静态分配内存的. 2.链栈动态分配内存的特性使得它一般无需考虑栈溢 ...
- C++实现链栈的基本操作
之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...
- 【小白成长撸】--链栈(C语言版)
// 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...
- C语言简单实现链栈基本几个功能(适合新手看,大神可指正)
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- C语言实现链栈的初始化&进栈&出栈&读取栈顶元素
/*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...
- C语言简单实现链栈基本几个功能
接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...
随机推荐
- 面试官:JavaScript如何实现数组拍平(扁平化)方法?
面试官:JavaScript如何实现数组拍平(扁平化)方法? 1 什么叫数组拍平? 概念很简单,意思是将一个"多维"数组降维,比如: // 原数组是一个"三维" ...
- JMeter学习记录收藏
1.如何进行一个简单的性能测试 2.JMeter各种功能名词解释,比较全 3.聚合报告分析 4.CSV文件参数化,名词解释 5.JMeter快捷键
- 谷粒 | 18 | Hystrix熔断器
Spring Cloud调用接口过程 Spring Cloud 在接口调用上,大致会经过如下几个组件配合: Feign ----->Hystrix ->Ribbon ->Http C ...
- RDD的详解、创建及其操作
RDD的详解 RDD:弹性分布式数据集,是Spark中最基本的数据抽象,用来表示分布式集合,支持分布式操作! RDD的创建 RDD中的数据可以来源于2个地方:本地集合或外部数据源 RDD操作 分类 转 ...
- git clone报错处理
git clone过大的仓库时会报以下错误 remote: aborting due to possible repository corruption on the remote side. fat ...
- linux删除文件未释放
https://access.redhat.com/solutions/2316 $ /usr/sbin/lsof | grep deleted ora 25575 data 33u REG 65,6 ...
- js中function (res) {}与(res) =>{}的区别
这里是引用function (res) {} 中 打印this时是undefined 打印that时是有内容的 let that = this; ...
- MAC电脑如何将常规视频中音频提取出来(转换格式并调整采样频率),并利用讯飞语音识别文字
1.下载好相关视频 2.选中需要提取视频,鼠标右键找到「编码所选视频文件」 3.设置中,下拉选择「仅音频」,点击继续 4.找到已提取成功的音频,鼠标右键或快捷键「command + I」,显示简介.默 ...
- SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(上)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们来测试下前面封装好的 WebClient,这里开始,我们使用 spock 编写 gro ...
- [loj2842]野猪
首先,并不一定走"除了上一次来的边"以外的最短路,但考虑"除了上一次来的边"以外的最短路和次短路(这里的次短路指最后一条边与最短路不同的"最短路&qu ...