栈(Stack)——class Stack 和 class Stack T 实现

对于Stack类的实现,跟之前链表实现也一样,只是封装成为面向对象的类了

PS:这里是线式存储的类和模板实现,链表式的实际上写法也是一样的

class Stack代码如下:

mystack.h

#include<stdlib.h>
#include<stdio.h>
struct Stack
{
        int _len;
        int _top;
        char * _space; //压入char类型
};
class mystack
{
    public:
        mystack(int sizeLen);  //初始化
        ~mystack(); //销毁
        bool isStackEmpty();
        bool isStackFull();
        void push(char ch);
        char pop();
        void resetStack();
    private:
        Stack * s;
};

mystack.cpp

#include "mystack.h"
mystack::mystack(int sizeLen)
{
    s->_len=sizeLen;
    s->_top=0;
    s->_space=(char*)malloc(sizeof(char*)*s->_len);
}
mystack::~mystack()
{
    free(s->_space);
}
bool mystack::isStackEmpty()
{
    return s->_top==0;
}
bool mystack::isStackFull()
{
    return s->_top==s->_len;
}
void mystack::push(char ch)
{
    s->_space[s->_top++]=ch;
}
char mystack::pop()
{
    return  s->_space[--s->_top];
}
void mystack::resetStack()
{
    s->_top=0;
}


main函数

#include <iostream>
#include"mystack.h"
using namespace std;
int main()
{
    mystack s(26);
    if(!s.isStackFull())
    {
        for(char ch = 'A';ch<='Z';ch++)
            s.push(ch);
    }
    //s.resetStack();
    while(!s.isStackEmpty())
        printf("%c ",s.pop());
    s.~mystack();
    return 0;
}
 

class Stack T (模板)实现如下:

mystack.h

#include<stdlib.h>
#include<stdio.h>
template<typename T>
class mystack   //这里需要把struct定义放在类的定义中
{
    public:
        mystack(int sizeLen);  //初始化
        ~mystack(); //销毁
        bool isStackEmpty();
        bool isStackFull();
        void push(T ch);
        T pop();
        void resetStack();
    protected:
        struct Stack
        {
                int _len;
                int _top;
                T * _space; //压入char类型
        };
    private:
        Stack * s;
};

//这里需要再头文件中放置全部的模板声明和定义,若放在cpp里编译不通过
template<typename T> //每个函数前都要写,注意格式,其他跟上面的 class 一样
mystack<T>::mystack(int sizeLen)
{
    s->_len=sizeLen;
    s->_top=0;
    s->_space=(char*)malloc(sizeof(char*)*s->_len);
}

template<typename T>
mystack<T>::~mystack()
{
    free(s->_space);
}

template<typename T>
bool mystack<T>::isStackEmpty()
{
    return s->_top==0;
}

template<typename T>
bool mystack<T>::isStackFull()
{
    return s->_top==s->_len;
}

template<typename T>
void mystack<T>::push(T ch)
{
    s->_space[s->_top++]=ch;
}

template<typename T>
T mystack<T>::pop()
{
    return  s->_space[--s->_top];
}

template<typename T>
void mystack<T>::resetStack()
{
    s->_top=0;
}

main函数

#include <iostream>
#include"mystack.h"
using namespace std;
int main()
{
    mystack<char> s(26);
    if(!s.isStackFull())
    {
        for(char ch = 'A';ch<='Z';ch++)
            s.push(ch);
    }
    //s.resetStack();
    while(!s.isStackEmpty())
        printf("%c ",s.pop());
    s.~mystack();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42513339/article/details/81268866
今日推荐