数据结构基础——栈的C++实现
一、存储基本数据类型的栈的实现1、创建文件MyStatck.h#ifndef MYSTATCK_H#define MYSTATCK_Hclass MyStatck{public:MyStatck(int size);~MyStatck();bool statckEmpty()const;bool statckFull()const ;
·
一、存储基本数据类型的栈的实现
1、创建文件MyStatck.h
#ifndef MYSTATCK_H
#define MYSTATCK_H
class 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_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 16
using 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;
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)