实现一个可迭代的栈

本文介绍了如何在C++中实现一个可迭代的栈,通过范围for循环语句进行迭代遍历。首先,讨论了范围for循环的要求,即类需要提供指向第一个元素和最后一个元素的迭代器。接着,提出了使用指针简化问题,并展示了如何创建一个基于指针的可迭代栈。文章包括实现、测试和运行结果的详细步骤。

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

范围for循环

集合类数据类型的基本操作之一就是迭代遍历并处理集合中的每个元素
C++提供了范围for循环语句实现这个操作(从头到尾依次遍历元素)。

一个可用于范围for循环(可迭代)语句的类必须满足以下条件:
(1)实现begin()方法。获取指向第一个元素的迭代器或指针。
(2)实现end()方法。获取指向最后一个元素的下一个元素的迭代器或指针。
(3) begin()end()的返回值支持++操作。

std::vector<int> vi = { 0, 1, 2, 3, 4, ,5, 6, 7, 8, 9 };
for (auto x : vi) {
	std::cout << x << std::endl;
}

等价于

for (auto it = vi.begin(); it != vi.end(); ++it) {
	std::cout << *it << std::endl;
}

Iterable

介于迭代器类比较复杂,先用指针来说明这个问题。
iterable.h

#ifndef ITERABLE_H
#define ITERABLE_H

template <typename Item>
class Iterable {
public:
    virtual Item *begin() = 0;
    virtual Item *end() = 0;
};

#endif

原始指针类型的变量一定是可以做++运算的。
如此一来,凡是公有继承Iterable的非抽象类都可用在范围for循环语句上。

可迭代栈

使用FixStack公有继承Iterable,实现一个可迭代的栈。

实现

fix_stack.h

#ifndef FIX_STACK
#define FIX_STACK

#include <cstddef>
#include "iterable.h"

template <typename Item>
class FixStack : public Iterable<Item> {
public:
    FixStack(size_t cap);
    ~FixStack();

    Item *begin() override;
    Item *end() override;

    void Push(const Item &item);
    Item Pop();
    bool IsEmpty() const;
    size_t Size() const;

private:
    void ReSize(size_t max);

    size_t cap_;
    size_t sz_;
    Item *data_;
};

template <typename Item>
FixStack<Item>::FixStack(size_t cap) : cap_(cap), sz_(0)
{
    data_ = new Item[cap_];
}

template <typename Item>
FixStack<Item>::~FixStack()
{
    delete[] data_;
    data_ = nullptr;
}

template <typename Item>
Item *FixStack<Item>::begin()
{
    return data_;
}

template <typename Item>
Item *FixStack<Item>::end()
{
    return data_ + sz_;
}

template <typename Item>
void FixStack<Item>::ReSize(size_t max)
{
    Item *newData = new Item[max];
    for (size_t i = 0; i < sz_; ++i) {
        newData[i] = data_[i];
    }

    data_ = newData;
    cap_ = max;
}

template <typename Item>
void FixStack<Item>::Push(const Item &item)
{
    if (sz_ == cap_) {
        ReSize( 2 * cap_);
    }
    data_[sz_++] = item;
}

template <typename Item>
Item FixStack<Item>::Pop()
{
    return data_[--sz_];
}

template <typename Item>
bool FixStack<Item>::IsEmpty() const
{
    return sz_ == 0;
}

template <typename Item>
size_t FixStack<Item>::Size() const
{
    return sz_;
}
#endif

测试

void FixStackTest2()
{
    FixStack<std::string> st(1);
    std::string str;

    while (std::cin >> str) {
        st.Push(str);
    }

    for (auto x : st) {
        std::cout << x << std::endl;
    }
}

运行

int main()
{
    FixStackTest2();

    return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值