数据结构基础——栈的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_H2、创建文件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_H2、创建文件 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
- 数据结构-栈的相关理解和C语言基础实现
- 数据结构基础系列——链栈的实现
- 数据结构基础——栈的C++实现
- 数据结构——链栈的实现(C语言)
- 数据结构C 语言描述——实现栈的基本功能
- 算法与数据结构基础2:C++String类的实现
- 基础数据结构--栈实现
- 数据结构基础系列——单链表的实现
- 数据结构基础——循环队列的C++实现
- 数据结构基础(一)栈的实现
- 数据结构基础【06】栈的链式实现
- 数据结构——用数组实现的栈的基础功能
- 数据结构——栈的动态实现(malloc/free)(C语言实现)
- 数据结构——栈的动态实现(brk/sbrk)(Unix C语言实现)
- 基础数据结构:栈、队列——Python实现
- 数据结构——单链表的实现——C语言版
- 数据结构——队列的链式实现(C语言)
- 数据结构——二叉查找树的详细实现(c++)
- Android开源库-用于显示标签的流式布局
- 公钥、私钥和数字签名理解
- 网页编码utf8 gb2312 gbk的区别
- HDU 5491 The Next(构造)
- mysql for windows 密码重置
- 数据结构基础——栈的C++实现
- 单片机--iic
- 玩转四旋翼无人机(姿态控制 in ArduPilot)
- php中中文字符串的截取和获取长度 mb_substr() mb_strlen()
- Android实现二维码的生成和扫描
- HDU 5489 Removed Interval(DP)
- Python PyInstaller命令
- Unity 控制摄像机跟随运动物体
- TOJ 2577.Rounders