zoukankan      html  css  js  c++  java
  • 链表 写队列和栈 练习代码

    #pragma once
    #include "MyLink.h"

    template<typename T>
    class MyStack {
    MyLink<T> lk;
    MyStack& operator=(const MyStack&);
    MyStack(const MyStack&);
    public:
    MyStack(){}
    size_t StackGetSize() { return lk.GetSize(); }
    bool StackPushBack(const T& e) { return lk.AppendElement(e); }
    bool StackPopBack() { return lk.DeleteTail(); }
    T StackGetTop() { return lk.GetTail(); }
    bool StackEmpty() { return GetSize() == 0; }
    void StackPrint() { lk.PrintLinkList(); }
    };

    //===========================

    #pragma once

    #include "MyLink.h"

    template<typename T>
    class MyQueue {
    MyLink<T> lk;
    MyQueue& operator=(const MyQueue&);
    MyQueue(const MyQueue&);
    public:
    MyQueue() {}
    size_t QueueGetSize() { return lk.GetSize(); }
    bool QueuePushBack(const T& e) { return lk.AppendElement(e); }
    bool QueuePopFront() { return lk.DeleteHead(); }
    T QueueGetHead() { return lk.GetHead(); }
    T QueueGetTail() { return lk.GetTail(); }
    bool QueueEmpty() { return GetSize() == 0; }
    void QueuePrint() { lk.PrintLinkList(); }
    };

    //==================================

    #pragma once
    #include <memory>
    #include <iostream>

    template <typename T>
    class MyLink {
    struct LinkNode {
    T val;
    std::shared_ptr<LinkNode> next;
    };

    size_t linkSize_;
    std::shared_ptr<LinkNode> begin_;
    std::shared_ptr<LinkNode> end_;

    MyLink& operator=(const MyLink&);
    MyLink(const MyLink&);
    public:
    MyLink():begin_(nullptr),end_(nullptr), linkSize_(0){}
    size_t GetSize() { return linkSize_; }
    T GetHead() { return begin_->val; }
    T GetTail() { return end_->val; }
    bool AppendElement(const T& e) {
    bool ret = false;
    std::shared_ptr<LinkNode> node(new LinkNode);
    if (node == nullptr)
    return ret;
    node->val = e;
    node->next = nullptr;

    if (nullptr == end_ || nullptr == begin_) {
    begin_ = end_ = node;
    linkSize_++;
    ret = true;
    return ret;
    }

    end_->next = node;
    end_ = node;

    linkSize_++;
    ret = true;
    return ret;
    }

    bool DeleteTail() {
    bool ret = false;
    // 无元素 或者 仅有一个元素情况
    if (begin_ == end_) {
    if (end_ != nullptr) {
    linkSize_--;
    }
    begin_ = end_ = nullptr;
    ret = true;
    return ret;
    }

    std::shared_ptr<LinkNode> p = begin_;
    while (p->next != nullptr) {
    if (p->next == end_) {
    end_ = p;
    p->next = nullptr;

    linkSize_--;
    ret = true;
    return ret;
    }
    p = p->next;
    }

    return ret;
    }

    bool DeleteHead() {
    bool ret = false;
    // 无元素 或者 仅有一个元素情况
    if (begin_ == end_) {
    if (begin_ != nullptr) {
    linkSize_--;
    }
    begin_ = end_ = nullptr;
    ret = true;
    return ret;
    }

    begin_ = begin_->next;

    linkSize_--;
    ret = true;
    return ret;
    }

    void PrintLinkList() {
    std::shared_ptr<LinkNode> p = begin_;
    std::cout << "print linklist: " << std::endl;
    while (p != nullptr) {
    std::cout << p->val << " ";
    p = p->next;
    }
    std::cout << std::endl;
    std::cout << "link size is " << linkSize_ << std::endl;
    std::cout << std::endl<< std::endl;
    }



    };

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    简易的观察者模式
    SSM项目实战 之 权限管理系统
    SSM项目实战 之 Shiro
    SSM项目实战 之 Maven
    SSM项目实战 之 EasyUI
    Oracle复习思路
    Oracle存储过程 函数 计算使用资源
    Mybatis笔记(二)
    Mybatis笔记(一)
    Oracle表空间 与 分页
  • 原文地址:https://www.cnblogs.com/itdef/p/6374446.html
Copyright © 2011-2022 走看看