C++ 栈 (链表实现)

第一、基本概念

栈中的元素遵守“先进后出”的原则(LIFO,Last In First Out)

  只能在栈顶进行插入和删除操作

  压栈(或推入、进栈)即push,将数据放入栈顶并将栈顶指针加一

  出栈(或弹出)即pop,将数据从栈顶删除并将栈顶指针减一

  栈的基本操作有:poppush判断空获取栈顶元素求栈大小

第二、实现方式

栈一般 采用数组或者链表2中方式实现,各有各的特点,我这里采用倒插法链表实现

第三、代码实现

#pragma once
#include <iostream>
using namespace std;
template<class T> struct node {
    T value;  //储存的值
    node<T>* next;
    node() :next(nullptr) {};
    node(T t) : value(t), next(nullptr) {}
};

template <typename T> class Stack {
    int length; //入栈数量
    node<T> *head; //栈的头部
public:
    Stack() { length = 0; head = new node<T>; }
    void push(T arg); //入栈
    T pop();  //出栈
    T top(); //获取栈顶元素

    void print(); //打印栈
    int size(); //获取栈内元素个数
    bool isEmpty(); //判断空
};

template<typename T>
void Stack<T>::push(T arg) {
    node<T>* pnode = new node<T>(arg);
    pnode->next = head->next;
    head->next = pnode;
    length++;
}

template<typename T>
T Stack<T>::pop() {
    if (head->next!=NULL)
    {
        node<T>* pnode = head->next;
        T pdata = pnode->value;
        head->next = head->next->next;
        delete pnode;
        return pdata;
    }
}

template<typename T>
T Stack<T>::top() {
    while (head->next!=NULL)
    {
        return head->next->value;
    }
}

template<typename T>
void Stack<T>::print() {
    while (head->next != NULL)
    {
        head = head->next;
        cout << head->value << endl;
    }
}
template<typename T>
int Stack<T>::size() {
    return length;
}

template<typename T>
bool Stack<T>::isEmpty() {
    return length == 0;
}

测试

#include "pch.h"
#include "Stack.h"
#include <iostream>
using namespace std;

int main()
{
    Stack<int> st;
    st.push(1);
    st.push(2);
    st.push(4);

    st.print();

    std::cout << "Hello World!\n";
}

原文地址:https://www.cnblogs.com/clc2008/p/10162919.html

时间: 2024-08-01 04:17:48

C++ 栈 (链表实现)的相关文章

栈---链表实现

栈:是一种后进先出(LIFO)的结构,对其插入删除只能在栈顶进行: 链表实现 节点: #include<stdio.h> #include<stdlib.h> typedef struct Node *PtrToNode; typedef PtrToNode Stack; struct Node{ int Element; struct Node *Next; } 进栈(push): void Push(int x,Stack s) { PtrToNode p; p = (PtrT

栈——链表实现

引言: 栈是先进后出的数据结构类型.在许多应用中也会经常用到,比如迷宫的求解时会用到栈结构.掌握栈的基本操作对于解决问题,有很大的帮助,尤其是编程中经常用到的递归的思想,就是栈的一个例子. 分析描述: 栈的实现有两种方法,一种是用链表来完成.这种方法比较简单,我们先掌握这种方法.另一种是用顺序表(即数组)来实现栈.下一节会介绍到. 栈节点描述. typedef int ElemType; typedef struct Node{ ElemType data; struct Node *next;

垃圾回收机制和数据结构栈链表

1.垃圾回收机制: (1)没有引用变量指向的对象,就是垃圾. 举例: Test t = new Test(); t=null; 那么之前创建的对象就是垃圾. (2)对象没有被使用是另外一种垃圾. new Test(); new Test().toString(); 区别在于第一个对象很明显没有指向,是垃圾.但是第二个不是,因为他被使用了. 2.回收时机. 通常情况下,要在满了的时候回收. 其次在调用 System.gc();//通常情况下会立刻回收.等效于Runtime.getRuntime.g

【C/C++学院】0802-链式栈/链表队列以及优先队列/封装链表库

链式栈 // stacklinknode.h #define datatype int struct stacknode { int num;//编号 datatype data;//数据 struct stacknode *pNext;//指针域 }; typedef struct stacknode StackNode;//简化 StackNode * init(StackNode * phead);//初始化 StackNode * push(StackNode * phead, int

算法导论10:栈链表的简化、队列的数组实现 2016.1.10

新年的前十天做了比较有意义的事情就是坚持每天写博客,明天就开始期末考试了,所以等假期再继续学习. 把昨天提到的S.bottom简化之后又改了栈的链表.代码如下(已折叠): #include<stdio.h> #include<stdlib.h> typedef struct _node{ int num; struct _node *next; }node; node *s; void build(node *&S) { s=(node *)malloc(sizeof(no

【数据结构】栈-链表的实现

链表的实现和数组的实现最大的不同在于链表的插入操作代价要低于数组,不过总体代价还是数组更低,因为链表的构造和连接部分代价其实很高. 基本结构 private Node head = null; push操作 public void push(String str) { // create a new node and put the str into item Node newNode = new Node(str); // insert before the new node newNode.

浅谈数据结构系列 栈和队列

计算机程序离不开算法和数据结构,在数据结构算法应用中,栈和队列应用你比较广泛,因为两者在数据存放和读取方面效率比较高,本章节重点讲解两者的基本概念和实现. 基本概念 栈:是一种先进后出,后进先出的数据结构,本质上是线性表,只是限制仅允许在表的一段进行插入和删除工作.此端为栈顶,这是在栈中应用很关键的概念.所有数据的处理都是在栈顶进行的,进栈时,栈中元素增加,栈顶上移一位,出栈时栈顶下移一位.应用中比如:洗碗,每次洗干净的碗放在上面-进栈,取碗,从顶上取出一个-出栈:装子弹-进栈,开枪-出栈. 队

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

读后感 《大话数据结构》

良性循环 阅读书籍是在进行理论研究. 只读书而不去实践,就会出现"百无一用是书生"的情况. 基于社会需求的实践才会带来物质财富. 获得精神财富是没有门槛的,只要你愿意去发现.愿意去找寻智慧及真善美,你就可以寻得到. 数学公式与编程 我写过 1+2+3+4+5+-+100的各种循环实现求和,但是没有一次意识到这个序列是一个等差数列.高中时候讲的.反复强调的知识居然被我忘记了.在这本书中,指出了该序列是等差数列,1到100求和可以使用求和公式时,有种挫败感从心底生出,不由得对数学产生了新的

20160225.CCPP体系详解(0035天)

程序片段(01):CircleList.h+CircleList.c+main.c 内容概要:环形链表 ///CircleList.h #pragma once #include <stdio.h> typedef struct node { int data; struct node * pNext; }Node; void circleListTailInsertData(Node ** ppCircleList, int data); void circleListHeadInsertD