栈、队列都更改成模板类
栈
.hpp
#ifndef MY_STACK_H
#define MY_STACK_H
#include <iostream>using namespace std;template<typename T>
class my_stack
{
private:T *base;//动态栈指针int top;//栈顶元素int size;//栈大小
public:my_stack();//无参构造my_stack(T size):top(-1),size(size){base = new T[this->size];cout<<"有参构造"<<endl;}~my_stack(){delete []base;cout<<"析构函数"<<endl;}//赋值my_stack<T> & operator=(const my_stack<T> &str);//访问栈顶元素T my_top();//检查容器是否为空bool my_empty();//返回容纳元素数T my_size();//插入栈顶void my_push(T value);//删除栈顶void my_pop();
};//赋值
template<typename T>
my_stack<T> & my_stack<T>::operator=(const my_stack<T> &str)
{if(this != &str){delete []base;this->size = str.size;this->top = str.top;base = new int[size];for(int i = 0;i<size;i++){base[i] = str.base[i];}}return *this;
}//访问栈顶元素
template<typename T>
T my_stack<T>::my_top()
{if(my_empty()){cout<<"栈为空"<<endl;return -1;}return base[top];
}//检查容器是否为空
template<typename T>
bool my_stack<T>::my_empty()
{return top == -1;
}//返回容纳元素数
template<typename T>
T my_stack<T>::my_size()
{return top+1;
}
//插入栈顶
template<typename T>
void my_stack<T>::my_push(T value)
{if(top >= size){cout<<"栈满"<<endl;return;}base[++top] = value;cout<<value<<"插入成功"<<endl;
}
//删除栈顶
template<typename T>
void my_stack<T>::my_pop()
{if(my_empty()){cout<<"栈为空"<<endl;return;}top--;cout<<"删除栈顶成功"<<endl;
}#endif // MY_STACK_H
主程序
#include "my_stack.hpp"
int main()
{my_stack<int> s(10);s.my_push(23);s.my_push(45);s.my_push(74);cout<<"栈顶 = "<<s.my_top()<<endl;cout<<"栈元素个数="<<s.my_size()<<endl;s.my_pop();cout<<"删除栈顶后栈元素个数="<<s.my_size()<<endl;return 0;
}
队列
.hpp
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>using namespace std;template<typename T>
class queue
{
private:T *base;//队列动态数组int front;//头部int rear;//尾部int size;//容器大小
public:queue();//无参构造queue(T size):front(0),rear(0),size(size)//有参构造{base = new T[size];cout<<"有参构造"<<endl;}//析构函数~queue(){delete [] base;cout<<"析构函数"<<endl;}//赋值queue<T> &operator=(const queue<T> &str);//访问第一个元素T my_front();//访问最后一个元素T my_back();//检查容器是否为空bool my_empty();//返回容器的元素数T my_size();//向队尾插入元素void my_push(T value);//删除首个插入元素void my_pop();
};//赋值
template<typename T>
queue<T> & queue<T>::operator=(const queue<T> &str)
{if(this != &str){delete []base;front = str.front;rear = str.rear;size = str.size;base = new int[size];for(int i = front;i<rear;i++){base[i] = str.base[i];}}return *this;
}
//访问第一个元素
template<typename T>
T queue<T>::my_front()
{if(my_empty()){cout<<"队列为空"<<endl;return -1;}return base[front];
}
//访问最后一个元素
template<typename T>
T queue<T>::my_back()
{if(my_empty()){cout<<"队列为空"<<endl;return -1;}return base[rear-1];
}
//检查容器是否为空
template<typename T>
bool queue<T>::my_empty()
{return rear == front;
}
//返回容器的元素数
template<typename T>
T queue<T>::my_size()
{return rear-front;
}
//向队尾插入元素
template<typename T>
void queue<T>::my_push(T value)
{base[rear++] = value;cout<<"插入成功"<<endl;
}
//删除首个插入元素
template<typename T>
void queue<T>::my_pop()
{if(my_empty()){cout<<"队列为空"<<endl;return;}cout<<"首元素"<<base[front++]<<"删除成功"<<endl;
}#endif // QUEUE_H
主程序
#include "queue.hpp"int main()
{queue<int> s(10);s.my_push(14);s.my_push(24);s.my_push(41);s.my_push(4);cout<<"最后一个元素是"<<s.my_back()<<endl;s.my_pop();cout<<"第一个元素"<<s.my_front()<<endl;return 0;
}
顺序表
.hpp
#ifndef SEQLIST_H
#define SEQLIST_H#include <iostream>
#include <cstring>
using namespace std;
template<typename T>
class My_string
{
private:T *ptr; //顺序表字符数组int size = 15; //数组的最大int len; //数组的实际长度public:My_string(); //无参构造//有参构造My_string(const T* src);My_string(T num,T value);//拷贝构造My_string(const My_string &other);//拷贝赋值My_string &operator = (const My_string &other);//析构函数~My_string();bool empty(); //判空void push_back(T value); //尾插void pop_back(); //尾删T listsize(); //求长度T & at(T inex); //获取任意位置元素void clear();//清空T *data();//返回C风格字符串T get_length();//返回当前最大容器void show(); //展示void append(const T *ptr);//扩容const My_string operator+(const My_string &other)const;//+运算符重载T &operator[](T n);//[]运算符重载bool operator>(const My_string &R)const;//>重载bool operator<(const My_string &R)const;//<重载bool operator==(const My_string &R)const;//==重载bool operator>=(const My_string &R)const;//>=重载bool operator<=(const My_string &R)const;//<=重载bool operator!=(const My_string &R)const;//!=重载My_string &operator +=(const My_string &R);//+=重载friend ostream &operator<<(ostream &L,const My_string &R);friend istream &operator>>(istream &L, My_string &R);
};template<typename T>
My_string<T>::My_string():size(15) //无参构造
{this->ptr = new char[size];this->ptr[0] = '\0';this->len = 0;
}
//有参构造
template<typename T>
My_string<T>::My_string(const T* src)
{len = strlen(src)+1;size = len >size?size*2:size;this->ptr = new char[size];strcpy(ptr,src);
}
template<typename T>
My_string<T>::My_string(T num,T value)
{size = num >size?size*2:size;ptr = new char[size];for(int i = 0;i<num;i++){this->ptr[i] = value;}this->len = num;
}
//拷贝构造
template<typename T>
My_string<T>::My_string(const My_string &other):ptr(new char[other.size]),size(other.size),len(other.len)
{strcpy(this->ptr,other.ptr);this->size = other.size;this->len = other.len;
}
//拷贝赋值
template<typename T>
My_string<T> &My_string<T>::operator = (const My_string<T> &other)
{if(this != &other){delete []ptr;size = other.size;ptr = new char[size + 1];strcpy(ptr,other.ptr);}return *this;
}
//析构函数
template<typename T>
My_string<T>::~My_string()
{delete []ptr;
}
template<typename T>
T *My_string<T>::data()//返回C风格字符串
{return ptr;
}
//判空
template<typename T>
bool My_string<T>::empty()
{return ptr[0] == 0;
}//尾插
template<typename T>
void My_string<T>::push_back(T value)
{this->ptr[len++] = value;
}//尾删
template<typename T>
void My_string<T>::pop_back()
{if(this->empty()){cout<<"表为空无删除对象"<<endl;return;}this->len--;
}
//求长度
template<typename T>
T My_string<T>::listsize()
{return this->len;
}
//获取任意位置元素
template<typename T>
T & My_string<T>::at(T index)
{if(this->empty()){throw std::out_of_range("表为空无对象");}if(index>this->len||index<=0){throw std::out_of_range("位置错误");}return this->ptr[index-1];
}//展示
template<typename T>
void My_string<T>::show()
{if(this->empty()){cout<<"表为空无对象"<<endl;return;}cout<<"当前顺序表中的元素是:";cout<<"ptr = "<<ptr<<" ";len = strlen(ptr);cout<<"len = "<<len<<endl;
}
template<typename T>
T My_string<T>::get_length()//返回当前最大容器
{return this->size;
}template<typename T>
void My_string<T>::clear()//清空
{delete []ptr;ptr = new char[1];ptr[0] = '\0';len = 0;
}template<typename T>
void My_string<T>::append(const T *src)
{int src_len = strlen(src);while(len+src_len >= size){size *= 2;char *new_ptr = new char[size];strcpy(new_ptr,ptr);delete []ptr;ptr = new_ptr;}strcat(ptr,src);len += src_len;
}template<typename T>
const My_string<T> My_string<T>::operator+(const My_string<T> &other)const//+运算符重载
{My_string temp;delete []temp.ptr;temp.len =this->len+other.len;temp.ptr = new char(temp.len+1);strcpy(temp.ptr,this->ptr);strcat(temp.ptr,other.ptr);return temp;}template<typename T>
T &My_string<T>::operator[](T n)//[]运算符重载
{if(n<0||n>len){cout<<"数组越界"<<endl;}else{return ptr[n-1];}
}template<typename T>
bool My_string<T>::operator>(const My_string<T> &R)const//>重载
{return strcmp(this->ptr,R.ptr)>0;
}template<typename T>
bool My_string<T>::operator<(const My_string<T> &R)const//<重载
{return strcmp(this->ptr,R.ptr)<0;
}template<typename T>
bool My_string<T>::operator==(const My_string<T> &R)const//==重载
{return strcmp(this->ptr,R.ptr)==0;
}template<typename T>
bool My_string<T>::operator>=(const My_string<T> &R)const//>=重载
{return strcmp(this->ptr,R.ptr)>=0;
}template<typename T>
bool My_string<T>::operator<=(const My_string<T> &R)const//<=重载
{return strcmp(this->ptr,R.ptr)<=0;
}template<typename T>
bool My_string<T>::operator!=(const My_string<T> &R)const//!=重载
{return strcmp(this->ptr,R.ptr)!=0;
}template<typename T>
My_string<T> &My_string<T>::operator +=(const My_string<T> &R)//+=重载
{My_string temp;temp.ptr = new char(len+1);strcpy(temp.ptr,this->ptr);temp.len = this->len;delete [] ptr;this->ptr = new char(temp.len+R.len+1);strcpy(ptr,temp.ptr);strcat(ptr,R.ptr);return *this;
}#endif // SEQLIST_H
主程序
#include "seqlist.hpp"
int main()
{My_string<char> s1("Hello");//拷贝构造My_string<char> s2 = s1;s2.show();//无参构造My_string<char> s3;//拷贝赋值s3 = s1;s3.show();s3.push_back('a');//C字符风格cout<<s3.data()<<endl;s3.pop_back();s3.append(" world ,good");s3.show();//求实际长度cout<<"s3容器的实际长度 = "<<s3.listsize()<<endl;cout<<"s3容器的最大长度 = "<<s3.get_length()<<endl;cout<<"s3容器2号元素= "<<s3.at(2)<<endl;//clears3 = s2+s1;s3.show();cout<<"s3[2]= "<<s3[2]<<endl;My_string<char> s4("good");return 0;
}