链栈,字面意思,就是用链表来实现一个栈的数据结构。

那么,只需将单链表的头节点当作栈顶,尾节点当作栈底。入栈只需要头插,出栈只需头删即可。所以只需要吧单链表稍微阉割一下就可以得到链式栈了。代码如下

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

  1. 03链栈_LinkStack--(栈与队列)

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

  2. 从零开始学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 ...

  3. java与数据结构(6)---java实现链栈

    栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...

  4. 链栈之C++实现

    链栈是借用单链表实现的栈.其不同于顺序栈之处在于: 1.链栈的空间是程序运行期间根据需要动态分配的,机器内存是它的上限.而顺序栈则是 静态分配内存的. 2.链栈动态分配内存的特性使得它一般无需考虑栈溢 ...

  5. C++实现链栈的基本操作

    之前对顺序栈写了基本操作,认为有必要也动手练练栈的链表实现. 对于链栈,一般不会出现栈满的情况. 链栈头文件定义例如以下: #ifndef CSTOCK_H_ #define CSTOCK_H_ ty ...

  6. 【小白成长撸】--链栈(C语言版)

    // 链栈.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #include <st ...

  7. C语言简单实现链栈基本几个功能(适合新手看,大神可指正)

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

  8. 数据结构——Java实现链栈

    一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...

  9. C语言实现链栈的初始化&进栈&出栈&读取栈顶元素

    /*链表实现栈的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typede ...

  10. C语言简单实现链栈基本几个功能

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

随机推荐

  1. DeWeb 简介

    DeWeb是一个可以直接将Delphi程序快速转换为网页应用的工具! 使用DeWeb, 开发者不需要学习HTML.JavaScript.Java.PHP.ASP.C#等新知识,用Delphi搞定一切. ...

  2. 基于Dapr的 Azure 容器应用

    微软在 Ignite 2021 大会上发布了预览版的Azure Container Apps,这是一个完全托管的无服务器容器运行时间,用于大规模构建和运行现代应用程序.从2021 年 11 月 2 日 ...

  3. 为什么建议使用你 LocalDateTime ,而不是 Date?

    在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到: 为什么需要LocalDate.Loca ...

  4. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  5. vue3 学习笔记 (二)——axios 的使用有变化吗?

    本篇文章主要目的就是想告诉我身边,正在学 vue3 或者 准备学 vue3 的同学,vue3中网络请求axios该如何使用,防止接触了一点点 vue3 的同学会有个疑问?生命周期.router .vu ...

  6. updatexml和extractvalue函数报错注入

    updatexml()函数报错注入 updatexml (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XM ...

  7. 花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘

    本文所有内容均节选自<设计模式就该这样学> 序言 Design Patterns: Elements of Reusable Object-Oriented Software(以下简称&l ...

  8. shell常用集锦

    该文整理一些常用的shell用法,及语法,并非介绍如何使用 变量 变量可分为两类:环境变量ENV(全局)和局部变量. bash环境变量 变量名 含义 _= 上一条命令的最后一个参数 BASH_VERS ...

  9. linux中为何每次修改完配置文件后都需要重新加载配置文件

    1.大家刚接触linux时,可能会有这样的疑问:为什么每次修改完配置文件之后,总是要重新加载配置文件才能生效?或者需要重启后才能生效?   之前听过一个解释是这样子的:   "修改了文件内容 ...

  10. [ARC 122]

    最近状态差到爆炸. \(AT\)连掉两把分,啥时候能上黄啊. \(A\) 考虑直接动归. 把\(O(n^2)\)的动归后缀和优化成\(O(n)\) A #include<iostream> ...