链式栈:就是一种操作受限的单向链表,每次入栈一个元素,向链表中添加一个节点,出栈一个元素,释放一个节点。因为栈具有“后进先出”的特点,如果每次在链表的尾部进行插入和删除,就要遍历整个链表来找到尾节点。而在头部进行插入和删除时,只需根据头指针即可找到链表的首元素结点。而无需遍历链表。所以链式栈的出,入栈通过对链表进行头删和头插来实现。

代码是在链表的二次封装,先阅读底层实现更佳LinkedList

代码清单

LinkedListStack.h

#ifndef C___LINKEDLISTSTACK_H
#define C___LINKEDLISTSTACK_H
#include "LinkedList.h"
template<typename T>
class Stack {
public:
virtual int getSize()const = 0;
virtual bool isEmpty()const = 0;
virtual void push(T& e) = 0;
virtual T pop() = 0;
virtual T peek()const = 0;
}; template<typename T>
class LinkedListStack : public Stack<T> {
public:
LinkedListStack();
int getSize()const;
bool isEmpty()const;
void push(T&e);
T pop();
T peek()const;
void print()const;
private:
LinkedList<T>*list;
}; template<typename T>
int LinkedListStack<T>::getSize() const {
return list->getSize();
} template<typename T>
bool LinkedListStack<T>::isEmpty() const {
return list->isEmpty();
} template<typename T>
void LinkedListStack<T>::push(T& e) {
list->addFirst(e);
} template<typename T>
T LinkedListStack<T>::pop() {
return list->removeFirst();
} template<typename T>
T LinkedListStack<T>::peek()const {
return list->getFirst();
} template<typename T>
void LinkedListStack<T>::print() const {
std::cout << "Stack: size = " << list->getSize() << std::endl;
std::cout << "bottom ";
list->print();
std::cout << " top" << std::endl;
} template<typename T>
LinkedListStack<T>::LinkedListStack() {
list = new LinkedList<T>();
} #endif //C___LINKEDLISTSTACK_H

main.cpp

int LinkedListStack()
{
LinkedListStack<int>*ls = new LinkedListStack<int>();
for(int i = 0;i<10;++i)
{
ls->push(i);
ls->print();
}
cout<<"isEmpty()"<<ls->isEmpty()<<endl;
cout<<"getSize()"<<ls->getSize()<<endl;
cout<<"peek"<<ls->peek()<<endl;
cout<<"pop"<<ls->pop()<<endl;
ls->print();
return 0;
}

链表栈(LinkedListStack)的更多相关文章

  1. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  2. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  3. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  4. 12.java链表栈和数组栈

    栈是一个先入后出的有序列表,栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,一端为变化的一端,称为栈顶,另一端是固定的,称为栈底.先入的元素在栈底,最后放入的元素在栈顶,删除 ...

  5. bzoj 1098 办公楼biu —— 链表+栈

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1098 首先,没有连边的人一定得在一个连通块里: 先把所有人连成一个链表,然后从第一个人开始, ...

  6. 链表栈C语言实现

    #ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED #include <stdlib.h> #include <std ...

  7. 链表栈的C语言实现

    #ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { ...

  8. liststack——链表栈(procedure)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h&q ...

  9. 剑指offer-反向遍历链表-栈和递归2种方法(一次性跑通)

  10. 算法入门 - 链表的实现及应用(Java版本)

    之前我们学习了动态数组,虽然比原始数组的功能强大了不少,但还不是完全纯动态的(基于静态数组实现的).这回要讲的链表则是正儿八经的动态结构,是一种非常灵活的数据结构. 链表的基本结构 链表由一系列单一的 ...

随机推荐

  1. python web连接mysql数据库

    一定要commit,否则数据库不会发生改变!!! 1.使用python写入内容到数据库 import pymysql # 记得下载并引入pymysql # 1.连接mysql,db:声明数据库 con ...

  2. 【Android逆向】静态分析+frida破解test2.apk

    有了上一篇的基础 https://www.cnblogs.com/gradyblog/p/17152108.html 现在尝试静态分析的方式来处理 为什么还要多此一举,因为题眼告诉了我们是五位数字,所 ...

  3. 前端树形Tree数据结构使用-🤸🏻‍♂️各种姿势总结

    01.树形结构数据 前端开发中会经常用到树形结构数据,如多级菜单.商品的多级分类等.数据库的设计和存储都是扁平结构,就会用到各种Tree树结构的转换操作,本文就尝试全面总结一下. 如下示例数据,关键字 ...

  4. HTML学习---day01

    1.head标签 <!DOCTYPE html> <!--文档声明H5 html--> <html lang="en"> <head> ...

  5. 【LeetCode哈希表#4】梦开始的地方:两数之和(map),以及关于容器map的一些代码技巧

    两数之和 力扣题目链接(opens new window) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种 ...

  6. 【Azure Service Bus】使用Spring Cloud integration示例代码,为多个 Service Bus的连接使用 ConnectionString 方式

    问题描述 查看Service Bus的Java示例代码,发现使用Spring Cloud Integration,配置 Application.yaml 可以连接到两个Service Bus. 但代码 ...

  7. 【Azure 存储服务】记一次调用Storage Blob API使用 SharedKey Authorization出现的403错误

    问题描述 使用Azure Storag Blob REST API上传文件,用SharedKey作为Authorization出现403错误. 错误消息 b'\xef\xbb\xbf<?xml ...

  8. C++ mySQL数据库连接池(windows平台)

    C++ MySQL数据库连接池 新手学了C++多线程,看了些资料练手写了C++数据库连接池小项目,自己的源码地址 关键技术点 MySQL数据库编程.单例模式.queue队列容器.C++11多线程编程. ...

  9. sentinel的见解

    Sentinel 是面向分布式.多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量控制.熔断降级.热点流量防护等多个维度来帮助开发者保障微服务的稳定性.   在 Sentinel 里面,所 ...

  10. vue开发过程常用的JSX语法

    参考资料:https://juejin.cn/post/7114063575122984973 在Vue项目的开发过程,经常会使用到JSX语法,对常用的JSX语法分类做个笔记,方便需要之时查阅 动态绑 ...