C++实现栈

尽管C++的STL库里面有Stack类,但是本着学习的目的,在参考他人成果的基础上,我决定自己实现一次。这个实现采用的是”链表+动态内存+模板”的方式实现。众所周知,栈是一种后进先出的数据结构,即先入栈的元素最后出栈,最后入栈的元素最先出栈。栈常常使用在计算机的变量存储中。
首先定义元素节点的数据结构:

template<typename T>
struct stackNode
{
    T data;//存储的具体元素
    stackNode* next;//指向下一个节点的指针
};

然后需要定义一个MyStack类:

template<typename T>
class MyStack
{
private:
    unsigned int count;//计数目前stack中存储的元素个数
    unsigned int maxSize;//stack中最大存储的元素个数
    stackNode<T>* top;//stack头节点的指针
public:
    MyStack();//默认构造函数,创建最多容纳10个元素的stack
    MyStack(unsigned int ms);//自定义容纳个数
    ~MyStack();//析构函数
    int push(T data);//压栈
    int pop(void);//出栈
    T getTop(void);//获取栈顶元素
    bool isempty(void);//检查是否为空
    bool isfull(void);//经检查是否已满
};

代码实现,注意:由于使用模板类,类中成员函数的实现需要在同一个.h文件连实现,不可以另外在同名的.cpp中实现;具体原因请见:https://blog.csdn.net/jinzeyu_cn/article/details/45795923,该博主研究比较深入。

template<typename T>
MyStack<T>::MyStack()
{
    count = 0;
    maxSize = 10;
    top = NULL;
}
template<typename T>
MyStack<T>::MyStack(unsigned int ms)
{
    count = 0;
    maxSize = ms;
    top = NULL;
}
template<typename T>
MyStack<T>::~MyStack()
{
    stackNode<T>* p = new stackNode<T>;
    for (unsigned int i = count; i >0; i--)
    {
        p = top;
        top = p->next;
        delete p;
    }
}
template<typename T>
int MyStack<T>::push(T data)
{
    count++;
    if (isfull())
    {
        cout << "Error: This Stack is full" << endl;
        cout << "File Path =" << __FILE__ << endl;
        cout << "Function Name =" << __FUNCTION__ << endl;
        cout << "Line =" << __LINE__ << endl;
        return 1;
    }
    stackNode<T>* node = new stackNode<T>;
    node->data = data;
    node->next = top;
    top = node;
    return 0;
}
template<typename T>
int MyStack<T>::pop(void)
{
    if (isempty())
    {
        cout << "Error: Stack is empty" << endl;
        cout << "File Path =" << __FILE__ << endl;
        cout << "Function Name =" << __FUNCTION__ << endl;
        cout << "Line =" << __LINE__ << endl;
        return 1;
    }
    stackNode<T>* p = top;
    top = top->next;
    delete p;
    count--;
    return 0;
}
template<typename T>
T MyStack<T>::getTop(void)
{
    return top->data;
}
template<typename T>
bool MyStack<T>::isempty(void)
{
    return count == 0 ? true : false;
}
template<typename T>
bool MyStack<T>::isfull(void)
{
    return count > maxSize ? true : false;
}

代码不多,测试一下吧

#include<iostream>
#include"myStack.h"

using namespace std;
struct customer
{
    char fullname[40];
    double payment;
};
int main()
{
    MyStack<customer> cus;
    customer c[] = { { "Tom", 1000 }, { "Jane", 200.9 }, { "John", 399.22 }, {"Mark",88.99} };
    customer temp;
    for (int i = 0; i < 4; i++)
    {
        cus.push(c[i]);
    }
    double total_payment=0;
    for (int i = 0; i < 4; i++)
    {
        temp = cus.getTop();
        cout << "Name" << temp.fullname << endl;
        cout << "payment=" << temp.payment << endl;
        total_payment += temp.payment;
        cout << "total payment=" << total_payment << endl;
        cus.pop();
        cout << endl;
    }

    system("pause");
    return 0;
}

运行良好。。。。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/shuoyueqishilove/article/details/80459886