数据结构基础——栈的C++实现

来源:互联网 发布:linux telnet连接拒绝 编辑:程序博客网 时间:2024/05/22 15:32

一、存储基本数据类型的栈的实现

1、创建文件MyStatck.h

#ifndef MYSTATCK_H#define MYSTATCK_Hclass MyStatck{public:    MyStatck(int size);    ~MyStatck();    bool statckEmpty()const;    bool statckFull()const ;    int statckLen();    void clearStatck();    bool push(char element);    bool pop(char &element);    void statckTraverse();private:    char *m_pstatck;    int m_iTop;    int m_iSize;};#endif // MYSTATCK_H
2、创建文件MyStatck.cpp

#include "MyStatck.h"#include <iostream>using namespace std;MyStatck::MyStatck(int size){    m_pstatck = new char[size];    m_iSize = size;    m_iTop = 0;}MyStatck::~MyStatck(){    delete[] m_pstatck;    m_pstatck = NULL;}bool MyStatck::statckFull()const{    return m_iTop == m_iSize ? true:false;}bool MyStatck::statckEmpty()const{    return m_iTop == 0 ? true:false;}void MyStatck::clearStatck(){    m_iTop = 0;}int MyStatck::statckLen(){    return m_iTop;}bool MyStatck::push(char element){    if(statckFull())        return false;    m_pstatck[m_iTop] = element;    m_iTop++;    return true;}bool MyStatck::pop(char &element){    if(statckEmpty())        return false;    m_iTop--;    element = m_pstatck[m_iTop];    return true;}void MyStatck::statckTraverse(){    cout<<"开始遍历-----------------------------"<<endl;    for(int i = 0 ;i < m_iTop;i++){        cout<<m_pstatck[i]<<endl;    }    cout<<"结束遍历-----------------------------"<<endl;}
3、在main函数写入如下代码测试定义的栈是否正确

#include <iostream>#include "MyStatck.h"using namespace std;int main(){    MyStatck *p = new MyStatck(5);    p->push('h');    p->push('e');    p->push('l');    p->push('l');    p->push('o');    p->statckTraverse();    char elem;    p->pop(elem);    cout<<elem<<endl;    p->statckTraverse();    /**注意此处是delete p    不能写成delete[] p**/    delete p;    p = NULL;    return 0;}

二、定义栈模板

1、创建文件MyStatck.h

#ifndef MYSTATCK_H#define MYSTATCK_H#include <iostream>using namespace std;template <typename T>class MyStatck{public:    MyStatck(int size);    ~MyStatck();    bool statckEmpty()const;    bool statckFull()const ;    int statckLen();    void clearStatck();    bool push(T element);    bool pop(T &element);    void statckTraverse();private:    T *m_pstatck;    int m_iTop;    int m_iSize;};/**类模板的定义和实现放在一起可能会出现问题,所以在此将定义和实现放在一起**/template <typename T> //每个成员函数的上方都要加这段代码MyStatck<T>::MyStatck(int size){    m_pstatck = new T[size];    m_iSize = size;    m_iTop = 0;}template <typename T>MyStatck<T>::~MyStatck(){    delete[] m_pstatck;    m_pstatck = NULL;}template <typename T>bool MyStatck<T>::statckFull()const{    return m_iTop == m_iSize ? true:false;}template <typename T>bool MyStatck<T>::statckEmpty()const{    return m_iTop == 0 ? true:false;}template <typename T>void MyStatck<T>::clearStatck(){    m_iTop = 0;}template <typename T>int MyStatck<T>::statckLen(){    return m_iTop;}template <typename T>bool MyStatck<T>::push(T element){    if(statckFull())        return false;    m_pstatck[m_iTop] = element;    m_iTop++;    return true;}template <typename T>bool MyStatck<T>::pop(T &element){    if(statckEmpty())        return false;    m_iTop--;    element = m_pstatck[m_iTop];    return true;}template <typename T>void MyStatck<T>::statckTraverse(){    cout<<"开始遍历-----------------------------"<<endl;    for(int i = 0 ;i < m_iTop;i++){        cout<<m_pstatck[i]<<endl;    }    cout<<"结束遍历-----------------------------"<<endl;}#endif // MYSTATCK_H
2、创建文件 Coordinate.h

#ifndef COORDINATE_H#define COORDINATE_H#include <ostream>/**使用ostream,istream,iostream一定要引入std命名空间否则会找不到类型**/using namespace std;class Coordinate{    /**运算符一般重载为友元函数,输入输出运算符重载的返回值的类型和参数类型都是引用**/    friend ostream &operator<<(ostream &out,Coordinate &coor);public:    Coordinate(int x=0,int y=0);    void printInfo();private:    int m_iX;    int m_iY;};#endif // COORDINATE_H

3、创建文件Coordinate.cpp

#include "Coordinate.h"#include <iostream>using namespace std;Coordinate::Coordinate(int x,int y){    m_iX = x;    m_iY = y;}void Coordinate::printInfo(){    cout<<"("<<m_iX<<","<<m_iY<<")"<<endl;}/**注意输出运算符的重载**/ostream &operator<<(ostream &out,Coordinate &coor){    out<<"("<<coor.m_iX<<","<<coor.m_iY<<")"<<endl;    return out;}
5、测试定义的栈模板,并使用栈完成进制转换和检查括号是否匹配

#include <iostream>#include <cstring>#include "MyStatck.h"#include "Coordinate.h"#define BINARY 2#define OCTONARY 8#define HEXADECTMAL 16using namespace std;/**栈应用一:完成进制转换**/void jinZhiZhuanHuan(int n,int jinZhi){    char num[] = "0123456789ABCDEF";    MyStatck<int> *p = new MyStatck<int>(30);    int mod = 0;    while(n != 0){        mod = n % jinZhi;        p->push(mod);        n = n / jinZhi;    }    int elem = 0;    while(!p->statckEmpty()){        p->pop(elem);        cout<<num[elem];    }    cout<<endl;    delete p;    p = NULL;}/**栈应用二:判断括号是否匹配**/void piPeiKuohao(){    //char str[] = "[()]";    //char str[] = "[[()]";    char str[] = "[()]]";    //char str[] = "[([(]]))";    MyStatck<char> *p = new MyStatck<char>(30);    for(int i = 0;i < strlen(str);i++){        char elem = 0;        switch(str[i]){            case '[':                p->push(str[i]);                break;            case '(':                p->push(str[i]);                break;            case ')':                p->pop(elem);                if(elem != '('){                    cout<<"括号不匹配"<<endl;                    return;                }                break;            case ']':                p->pop(elem);                if(elem != '['){                    cout<<"括号不匹配"<<endl;                    return;                }                break;            default:                cout<<"default"<<endl;                break;        }    }    if(p->statckEmpty()){        cout<<"括号匹配"<<endl;    }else{        cout<<"括号不匹配"<<endl;    }}int main(){    MyStatck<Coordinate> *p = new MyStatck<Coordinate>(5);    p->push(Coordinate(1,2));    p->push(Coordinate(3,4));    p->push(Coordinate(5,6));    p->statckTraverse();    Coordinate c(0,0);    p->pop(c);    c.printInfo();    p->statckTraverse();    delete p;    p = NULL;    /**栈应用一:完成进制转换**/    jinZhiZhuanHuan(1348,OCTONARY);    /**栈应用二:判断括号是否匹配**/    piPeiKuohao();    return 0;}




0 0
原创粉丝点击