<泛> STL - stack 模拟实现

今天,看C++Template的时候看到那人写了一个Stack,于是乎,手痒,自己也写了一个,在拜读了STD文件和C++模板元编程某些小节之后,你们就看到了这篇代码。

经过上述一番经历之后,我重新写了myVector,使之更完善,更加服务于顶层结构,如:myStack

myVector实现

栈没什么写的,大部分精力都放在了重新构建底层容器上,STL里面的功能函数基本都实现了,除了std的各种相关的构造函数实在整不来那么多

测试效果:

#include "E:\数据结构\myStack.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    int arr[7]{ 1,3,5,8,7,4,55 };
    myVector<int> V{ arr,arr + 7 };
    myStack<int> S;
    myStack<int>S2{ V };

    cout << "test 1" << endl << endl;
    cout << "栈1添加一个元素 10" << endl << endl;
    S.push(10);
    cout << "栈1添加一个元素 15" << endl << endl;
    S.push(15);
    cout << "栈1顶部元素为:";
    cout << S.top() << endl << endl;
    S.pop();
    cout << "弹出栈1顶部元素" << endl << endl;
    cout << "栈1顶部元素为:";
    cout << S.top() << endl << endl;
    S.pop();
    cout << "弹出栈1顶部元素" << endl << endl;
    cout << "栈1添加元素 10、15" << endl << endl;
    S.push(5);
    S.push(12);

    cout << "交换栈1栈2" << endl << endl;
    S.swap(S2);

    cout << "test 2" << endl << endl;

    cout << "栈1:" << endl;
    myStack<int>::container_type container = S._Get_container();
    for (auto it : container)
        cout << it << " ";
    cout << endl << endl;

    cout << "栈2:" << endl;
    myStack<int>::container_type container2 = S2._Get_container();
    for (auto it : container2)
        cout << it << " ";
    cout << endl;
}

Template代码:

#ifndef _MY_STACK
#define _MY_STACK

#include <E:\数据结构\myVector.h>
template<class T,
    class myContainer = myVector<T> >
    class myStack
    {
public:  //public date-type information used by class design
    typedef myStack<T, myContainer> _Mytype;
    typedef myContainer container_type;
    typedef typename myContainer::value_type value_type;
    typedef typename myContainer::size_type size_type;
    typedef typename myContainer::_pointer _pointer;

#define self (*this)

public:  //basic functions of class

    myStack()
        {
        elems.clear();
        }

    myStack(const _Mytype& rhs)
        :elems(rhs.elems)
        { }

    explicit myStack(const myContainer& _container)
        :elems(_container)
        { }

    _Mytype& operator=(const _Mytype& other)
        {
        elems = other.elems;
        return self;
        }

public:  //some operator-loading functions of stack
    bool operator==(const _Mytype& rhs)
        {
        return elems == rhs.elems;
        }

    bool operator!=(const _Mytype& rhs)
        {
        return elems != rhs.elems;
        }

    bool operator<(const _Mytype& rhs)
        {
        return elems < rhs.elems;
        }

    bool operator>(const _Mytype& rhs)
        {
        return elems > rhs.elems;
        }

    bool operator<=(const _Mytype& rhs)
        {
        return !(self > rhs);
        }

    bool operator>=(const _Mytype& rhs)
        {
        return !(self < rhs);
        }

public: // main options of stack

    void push(T const& item)
        { //尾部添加元素
        elems.push_back(item);
        }

    void pop()
        { //将顶部元素删除
        if (elems.empty())
            throw "myStack<>::pop(): empty stack\n";
        elems.pop_back();
        }

    const T& top()const
        { //取顶部元素
        if (elems.empty())
            throw "myStack<>::top(): empty stack\n";
        return elems.back();
        }

    bool empty()const
        { //判空
        return elems.empty();
        }

    void swap(_Mytype& rhs)
        { //交换数据
        elems.swap(rhs.elems);
        }

    size_type size()const
        {  //get the size of stack
        return elems.size();
        }

    const myContainer& _Get_container()const
        {   //Get the container of stack
        return elems;
        }

private:
    myContainer elems;

    };

#endif

感谢您的阅读,生活愉快~

原文地址:https://www.cnblogs.com/lv-anchoret/p/9557852.html

时间: 2024-10-31 21:27:31

<泛> STL - stack 模拟实现的相关文章

洛谷 P1739 表达式括号匹配【STL/stack/模拟】

题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES":否则返回"NO".表达式长度小于255,左圆括号少于20个. 输入输出格式 输入格式: 一行:表达式 输出格式: 一行:"YES" 或"NO" 输入输出样例 输入样例#1: 2*(x+y)/(1-x)@ 输出样例#1

hdu 4941 STL HASH 模拟

http://acm.hdu.edu.cn/showproblem.php?pid=4941 比赛的时候现学的map的find...以前都是用下标做的,但是map用下标查询的话,如果查询的元素不存在,会插入一个新的元素. 贴一个map查找元素找到和找不到的模板 map<pair<int,int>,int>::iterator it=poshash.find(tmppos);//pair<int,int>poshash; int pp; if(it == poshash.

浅谈C++ STL stack 容器

浅谈C++ STL stack 容器 本篇随笔简单介绍一下\(C++STL\)中\(stack\)容器的使用方法和常见的使用技巧. stack容器的概念 \(stack\)在英文中是栈的意思.栈是一种基本的数据结构.而\(C++STL\)中的栈就是把这种数据结构模板化了. 栈的示意图如下:这是一个先进后出的数据结构.这非常重要!! 事实上,\(stack\)容器并不是一种标准的数据结构,它其实是一个容器适配器,里面还可以存其他的\(STL\)容器.但那种使用方法过于高深而且不是很常用,所以在此不

使用STL来模拟Treap的功能

问题描述 我们知道,Treap可以完成节点的动态插入.删除.查询,其每个操作的时间复杂度是O(log n),因为其实现较红黑树更为简单,因此常常用于某些场合,以替换红黑树的实现. Treap的每个节点维护了key, priority. struct Node { int key; int priority; Node (int k, int p): key(k), priority(p) {} } key是作为BST的键值,用于支持快速的插入.删除和查询操作,而priority则是用于维护最小堆

HDU 1022 Train Problem I (STL 栈模拟)

Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 30420    Accepted Submission(s): 11492 Problem Description As the new term comes, the Ignatius Train Station is very busy nowaday

C++ STL stack 括号匹配 源代码

// STL_stack.cpp : 定义控制台应用程序的入口点. // STL 栈stack #include "stdafx.h" #include <iostream> #include <stack> #include <map> #include <string> #include <time.h> using namespace std; multimap<char, char> match; mult

STL——Stack栈

首先,堆栈是一个线性表,插入和删除只在表的一端进行.这一端称为栈顶(Stack Top),另一端则为栈底(Stack Bottom).堆栈的元素插入称为入栈,元素的删除称为出栈.由于元素的入栈和出栈总在栈顶进行,因此,堆栈是一个后进先出(Last In First Out)表,即 LIFO 表c++ stl栈stack头文件为 #include <stack> 定义栈  stack<type(char,int,string,double,float)> s; c++ stl栈5个最

STL --&gt; stack栈

stack栈 c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO) 使用该容器时需要包含#include<stack>头文件: 定义stack对象的示例代码如下: stack<int>s1; stack<string>s2; stack的基本操作有: 1 s.empty() 如果栈为空返回true,否则返回false 2 s.size() 返回栈中元素的个数 3 s.pop() 删除栈顶元素但不返回其值 4 s.top() 返回栈顶的元素

stl stack

stack<int> mystack; //create mystack.push(1); mystack.pop(); // no return value mystack.size(); mystack.empty(); //true if the underlying container's size is 0, false otherwise.mystack.top(); // access the top element