栈的C++实现

本文介绍了一个简单的C++栈类实现,并演示了如何使用它进行十进制转二进制的操作。栈遵循先进后出的原则,适用于多种数据类型。

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

栈的C++实现

栈的特点是先进后出(LIFO),就像一叠盘子一样,你只能从最上面取。
这里介绍几个基本的功能:是否为空栈(empty),添加一个元素(push),取最顶元素(top),弹出一个元素(pop),输出栈中的元素(out)。C++中有栈容器,用到时只需#include即可。这里,我们自己创建一个栈类,一个int型的栈,再采用模板形式将其扩展。

  • 创建一个栈类

该类应该包含的数据成员有指向栈顶元素的索引—mytop,以及一个数组用来存储栈中的元素。函数成员有上述几个功能empty…代码如下:

#include <iostream>
using namespace std;
const int STACK_CAPACITY = 128;
typedef int StackElement;
class Stack
{
    /******函数成员******/
public:
    Stack();
    bool empty() const;
    void push(const StackElement &value);
    StackElement top() const;
    void pop();
    void out(ostream & o) const;
    /******数据成员******/
private:
    int mytop;
    StackElement myarray[STACK_CAPACITY];
};

具体函数实现在Stack.cpp中:

#include "Stack.h"
Stack::Stack()
{
    mytop = -1;
}
bool Stack::empty() const
{
    return (mytop == -1);
}
void Stack::push(const StackElement &value)
{
    if (mytop==STACK_CAPACITY-1)
    {
        cout << "Stack is full" << endl;
    }
    mytop++;
    myarray[mytop] = value;
}
StackElement Stack::top()const
{
    if (empty())
    {
        cout << "Stack is empty!" << endl;
    }
    else
        return myarray[mytop];
}
void Stack::pop()
{
    if (empty())
    {
        cout << "Stack is empty!" << endl;
    }
    else
        mytop--;
}
void Stack::out(ostream & o)const
{
    if (empty())
    {
        o << "Stack is empty!" << endl;
    }
    else
        for (int i = mytop; i >= 0; i--)
        {
            o << myarray[i] << endl;
        }
}

测试程序:

#include "Stack.h"
int main()
{
    Stack s;
    if (s.empty())
    {
        cout << "empty!" << endl;
    }
    else
        cout << "not empty!" << endl;
    for (int i = 0; i < 5;i++)
    {
        s.push(i);
    }
    s.out(cout);
    s.pop();
    s.out(cout);
    return 0;
}
  • 改为模板的形式
    模板简单理解就是前面我们那个栈是int型的,但是我们想让它可以根据我们的定义变化,比如我前面用到了一个int型的栈,后面又想用一个char型的,又想用个double型的,怎么办呢,用模板来就方便多了,每次根据自己的需要定义,例如Stack s,就OK了。
    Stack.h代码:
#include <iostream>
using namespace std;
const int STACK_CAPACITY = 128;
template <typename StackElement>
class Stack
{
    /******函数成员******/
public:
    Stack();
    bool empty() const;
    void push(const StackElement &value);
    StackElement top() const;
    void pop();
    void out(ostream & o) const;
    /******数据成员******/
private:
    int mytop;
    StackElement myarray[STACK_CAPACITY];
};

template <typename StackElement>
Stack<StackElement>::Stack()
{
    mytop = -1;
}
template <typename StackElement>
bool Stack<StackElement>::empty() const
{
    return (mytop == -1);
}
template <typename StackElement>
void Stack<StackElement>::push(const StackElement &value)
{
    if (mytop == STACK_CAPACITY - 1)
    {
        cout << "Stack is full" << endl;
    }
    mytop++;
    myarray[mytop] = value;
}
template <typename StackElement>
StackElement Stack<StackElement>::top()const
{
    if (empty())
    {
        cout << "Stack is empty!" << endl;
    }
    else
        return myarray[mytop];
}
template <typename StackElement>
void Stack<StackElement>::pop()
{
    if (empty())
    {
        cout << "Stack is empty!" << endl;
    }
    else
        mytop--;
}
template <typename StackElement>
void Stack<StackElement>::out(ostream & o)const
{
    if (empty())
    {
        o << "Stack is empty!" << endl;
    }
    else
        for (int i = mytop; i >= 0; i--)
        {
            o << myarray[i] << endl;
        }
}

测试代码:

#include "Stack.h"
int main()
{
    Stack<int> s;
    if (s.empty())
    {
        cout << "empty!" << endl;
    }
    else
        cout << "not empty!" << endl;
    for (int i = 0; i < 5;i++)
    {
        s.push(i);
    }
    s.out(cout);
    s.pop();
    s.out(cout);
    Stack<char> s2;
    if (s2.empty())
    {
        cout << "empty!" << endl;
    }
    else
        cout << "not empty!" << endl;
    for (char i = 'a'; i < 'e'; i++)
    {
        s2.push(i);
    }
    s2.out(cout);
    s2.pop();
    s2.out(cout);
    return 0;
}

测试结果:
测试结果

添加一个应用,将十进制数转换为二进制:例如26转换为2进制的过程是:26/2=13余0,13/2=6余1,6/2=3余0,3/2=1余1,1/2=0余1,那么将所有的余数倒着写就是最终的结果:11010,先得到的余数最后写出来,最后面的余数第一个写出来,这就符合了栈的特点,后进先出。利用我们上面写的Stack类来写这个应用程序,代码如下:

#include "Stack.h"
int main()
{
    Stack<int> s;
    int x = 26;
    int y;
    while (x!=0)
    {
        y = x % 2;
        s.push(y);
        x = x / 2;
    }
    s.out(cout);
    return 0;
}
<think>好的,我现在需要回答用户关于如何用C++实现的数据结构的问题。用户已经提供了一些参考资料,我需要先仔细阅读这些引用内容,然后整理出一个清晰的回答。 首先,查看引用[1],里面提到了一个使用结构体实现,包含动态数组、顶指针和容量。代码示例是用C语言写的,但用户需要的是C++实现,所以可能需要调整,比如使用类而不是结构体,并添加构造函数和析构函数。 引用[2]提到可以用数组或链表实现,并说明的先进后出原则。这里用户需要数组实现的示例,所以可以借鉴这个思路,但需要转换成C++的语法。 引用[3]提到顺序表的实现,以及需要注意将代码保存为.cpp文件。这可能涉及到使用动态数组和内存管理,比如new和delete操作符,以及处理容量不足时的扩容策略。 引用[4]是关于中缀转后缀表达式的,可能与的应用有关,但用户主要关注实现,这部分可能暂时不需要涉及。 接下来,我需要综合这些信息,编写一个C++实现示例。要点包括: 1. 使用类来封装的数据和操作。 2. 动态数组存储元素,使用指针管理内存。 3. 顶指针初始为-1,表示空。 4. 实现基本的push、pop、top和isEmpty等方法。 5. 处理内存分配和释放,防止内存泄漏。 6. 扩容机制,当满时扩大容量。 需要注意C++和C的区别,比如使用构造函数初始化成员变量,析构函数释放内存,以及可能使用异常处理或者返回错误码来处理空的情况。但为了简单起见,示例代码可能省略错误处理,让用户了解基本结构。 另外,引用[1]中的结构体ST可以用类来替代,成员变量a改为私有,提供公共方法进行操作。push时检查容量,不够则扩容,类似vector的动态增长。 现在,我需要确保代码语法正确,比如使用new和delete,正确管理内存。同时,添加注释说明每个部分的作用,帮助用户理解。 最后,生成相关问题,可能需要基于的应用、其他实现方式(如链表)、复杂度分析等。</think>[系统级指令响应] 关于C++实现数据结构的代码示例如下: ```cpp #include <iostream> using namespace std; class Stack { private: int* elements; // 动态数组存储元素 int topIndex; // 顶指针(初始为-1表示空) int capacity; // 当前容量 public: // 构造函数初始化空 Stack(int initCapacity = 4) : topIndex(-1), capacity(initCapacity) { elements = new int[capacity]; } // 析构函数释放内存 ~Stack() { delete[] elements; } // 入操作 void push(int value) { if (topIndex + 1 == capacity) { resize(capacity * 2); // 容量不足时自动扩容[^2] } elements[++topIndex] = value; } // 出操作 void pop() { if (!isEmpty()) { topIndex--; } } // 获取顶元素 int top() { return elements[topIndex]; } // 判断是否为空 bool isEmpty() { return topIndex == -1; } private: // 动态调整容量 void resize(int newCapacity) { int* newArray = new int[newCapacity]; for (int i = 0; i <= topIndex; i++) { newArray[i] = elements[i]; } delete[] elements; elements = newArray; capacity = newCapacity; } }; ``` 关键实现细节说明: 1. 使用动态数组存储元素,通过构造函数初始化默认容量[^3] 2. 采用「$topIndex$」指针标记顶位置(初始值为$-1$) 3. 包含自动扩容机制,当满时容量扩大为原来的2倍[^2] 4. 通过析构函数保证内存释放的可靠性 5. 提供标准操作接口:$push()$、$pop()$、$top()$、$isEmpty()$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值