C++数据结构——链栈的实现

本文介绍了在数据结构中,当元素个数变化大时如何利用C++实现链栈,以解决数组栈可能导致的空间浪费问题。通过节点结构定义及类模板实现链栈,并进行了简单测试,验证其功能。总结指出,当元素数量变化不大时,顺序栈可能更为合适。
摘要由CSDN通过智能技术生成

链栈的实现,其实是针对栈的元素的个数变化量很大的一种情况,使用数组的话有可能造成很大的数组浪费空间,这时使用链栈来动态伸长链栈就变得很优秀了


节点结构

#pragma once
template<typename T>
class Node {
public:
    T data;
    Node<T>  *next;
};

类模板:

#pragma once
#include<iostream>
#include"Node.h"
using namespace std;

template<typename T>
class Stack {
public:
    Stack();
    ~Stack();     
    bool Push(T x);    //元素入栈
    bool pop(T &element);      //栈顶元素出栈
    bool Getpop(T &element) { if (top != NULL) { element = top->data; return true; } return false; } //获取栈顶元素
    bool Empty() { return top == NULL ? true : false; }   //判空
private:
    Node<T> *top;
};


template<typename T>
Stack<T>::Stack() {
    top = NULL;
}
template<typename T>
Stack<T>::~Stack() {
    while (top->next!=NUll) {
        Node<T> *temp = top;
        top = top->next;
        delete temp;
        temp = NUll;
    }
    delete top;
    top = NULL;
}
template<typename T>
bool Stack<T>::pop(T &element) {
    if (top == NULL) {
        cout << "当前栈为空,无法再出栈" << endl;
        return false;
    }
    else {
        Node<T> *temp = top;
        element= temp->data;
        top = top->next;
        delete temp;
        temp = NULL;
        return true;
    }
}
template<typename T>
bool Stack<T>::Push(T x) {
    Node<T> *s = new Node<T>;
    if (s==NULL) {
        return false;    //内存申请失败,返回
    }
    s->data = x;
    s->next = top;
    top = s;
    return true;
}

代码简单测试:

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

void popStack(Stack<int> *MyStack);
void getpop(Stack<int> *MyStack);
int main() {
    Stack<int> *MyStack=new Stack<int>;
    int element = 0;
    getpop(MyStack);
    if (MyStack->Empty()) {
        cout << "当前栈空" << endl;
    }
    else {
        cout << "当前栈不为空" << endl;
    }
    /*入栈入五个元素,先入的元素会到栈底,最后入的元素会在栈顶*/
    MyStack->Push(1);         
    MyStack->Push(2);
    MyStack->Push(3);
    MyStack->Push(4);
    MyStack->Push(5);
    popStack(MyStack);
    if (MyStack->Empty()) {
        cout << "当前栈空" << endl;
    }
    else {
        cout << "当前栈不为空" << endl;
    }
    popStack(MyStack);
    popStack(MyStack);
    popStack(MyStack);
    popStack(MyStack);
    getpop(MyStack);
    return 0;
}

void popStack(Stack<int> *MyStack) {
    int element;
    if (MyStack->pop(element))
    {
        cout << "当前出栈元素为:" << element << endl;
    }
    else {
        cout << "当前栈为空,无法再出栈" << endl;
    }
}
void getpop(Stack<int> *MyStack) {
    int element;
    if (MyStack->Getpop(element)) {
        cout << "栈顶元素为:" << element << endl;
    }
    else {
        cout << "当前栈为空,所以无栈顶元素!" << endl;
    }
}

结果:

程序代码页面
总结:当栈中的元素个数变化不大时,我们应该使用顺序栈(因为使用链栈时多出来的一个指针域也会浪费空间)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值