c++模板编程学习之stack

这篇博客展示了如何使用C++模板实现一个通用的堆栈类`Stack`,利用`deque`作为默认容器。堆栈支持压入、弹出、查看顶部元素等操作,并实现了不同类型的堆栈之间的赋值。在`stack_test.cpp`中,通过实例演示了整数、浮点数堆栈的使用以及不同类型堆栈间的赋值,输出了相应的堆栈元素。在尝试访问空堆栈的顶部元素时,程序抛出了`out_of_range`异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘自c++ templates中文版基础部分

stack.h
#ifndef STACK_HPP
#define STACK_HPP
#include <deque>
#include <stdexcept>

template <typename T, typename CONT = std::deque<T>>
class Stack {
private:
    CONT elems;   // elements

public:
    void push(T const&);
    void pop();
    T top() const;

    bool empty() const {
        return elems.empty();
    }

    template <typename T2, typename CONT2>
    Stack<T, CONT>& operator=(Stack<T2, CONT2> const&);
};

template<typename T, typename CONT>
void Stack<T, CONT>::push(T const& elem)
{
    elems.emplace_back(elem);
}

template<typename T, typename CONT>
void Stack<T, CONT>::pop()
{
    if (elems.empty()) {
        throw std::out_of_range("Stack<>::pop(): empty stack");
    }
    elems.pop_back();
}

template<typename T, typename CONT>
T Stack<T, CONT>::top() const
{
    if (elems.empty()) {
        throw std::out_of_range("Stack<>::top(): empty stack");
    }
    return elems.back();
}

template<typename T, typename CONT>
template<typename T2, typename CONT2>
Stack<T, CONT>& 
Stack<T, CONT>::operator=(Stack<T2, CONT2> const& op2)
{
    if ((void*)this == (void*)&op2) {
        return *this;
    }

    Stack<T2, CONT2> tmp(op2);
	elems.clear();
    while (!tmp.empty()) {
		elems.push_front(tmp.top());
        tmp.pop();
    }
	return *this;
}

#endif //STACK_HPP
stack_test.cpp
#include <iostream>
#include <string>
#include <cstdlib>
#include "stack.h"
#include <vector>

int main()
{
    try {
        // stack of ints:
        Stack<int> intStack;
        Stack<float> floatStack;     // stack of floats
        // stack of doubles which uses a std::deque<> to manage the elements

        // manipulate int stack
        intStack.push(42);
        intStack.push(7);

        // manipulate float stack
        floatStack.push(7.7);

        // assign stacks of different type
        floatStack = intStack;

        // print float stack
        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
        std::cout << floatStack.top() << std::endl;
        floatStack.pop();
    }
    catch (std::exception const& ex) {
        std::cerr << "Exception: " << ex.what() << std::endl;
    }

    // stack for ints using a vector as an internal container
    Stack<int, std::vector<int> > vStack;
    //...
    vStack.push(42);
    vStack.push(7);
    std::cout << vStack.top() << std::endl;
    vStack.pop();
}

输出

7
42
Exception: Stack<>::top(): empty stack
7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值