day6_C++
- [模板 栈](#模板 栈)
- [模板 队列](#模板 队列)
- 思维导图
模板 栈
stack.h
#ifndef STACK_H
#define STACK_H
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 5
template<typename T>
class Stack
{
public:
/*构造函数*/
Stack();
/*拷贝构造函数*/
Stack(const Stack& others);
/*析构函数*/
~Stack();
/*判满 true 满 */
bool is_full();
/*判满 true 空*/
bool is_empty();
/*入栈*/
void in_stack(T e);
/*出栈*/
T out_stack();
/*清空栈*/
void clear_stack();
/*求栈顶元素*/
T get_stackTop_E();
/*求栈的大小*/
void get_stackSize();
private:
int top;
T *data;
};
#endif // STACK_H
stack.c
#include "stack.h"
template<typename T>
Stack<T>::Stack():data(new T[MAX]),top(-1)
{
memset(this->data,0,MAX);
//在堆区申请max个int大小的空间
cout<<"栈容器初始化成功"<<endl;
}
template<typename T>
Stack<T>::Stack(const Stack& others):data(new T[MAX]),top(others.top)
{
//深拷贝,将堆区内容也拷贝进来
for(int i = 0;i<MAX-1;i++){
this->data[i] = others.data[i];
}
cout<<"拷贝完成"<<endl;
}
template<typename T>
Stack<T>::~Stack()
{
//释放堆区数据
delete []data;
cout<<"析构完成"<<endl;
}
template<typename T>
bool Stack<T>::is_full()
{
if(this->top ==MAX-1)
return true;
else
return false;
}
template<typename T>
bool Stack<T>::is_empty()
{
if(this->top == -1)
return true;
else
return false;
}
template<typename T>
void Stack<T>::in_stack(T e)
{
if(this->is_full()==false){
this->top++;
this->data[this->top] = e;
cout<<"入栈成功"<<endl;
}else{
cout<<"入栈失败,栈满"<<endl;
}
}
template<typename T>
T Stack<T>::out_stack()
{
if(this->is_empty()==false){
T temp = this->data[this->top];
this->top--;
return temp;
}else{
cout<<"出栈失败,栈空"<<endl;
return NULL;
}
}
template<typename T>
void Stack<T>::clear_stack()
{
if(this->is_empty()==false){
this->top=-1;
cout<<"清空成功"<<endl;
}else{
cout<<"栈空,无需清理"<<endl;
}
}
template<typename T>
T Stack<T>::get_stackTop_E()
{
if(this->is_empty()==true)
return NULL;
return this->data[this->top];
}
template<typename T>
void Stack<T>::get_stackSize(){
cout<<"栈中有元素 "<<this->top+1<<"个"<<endl;
}
模板 队列
queue.c
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 5
template<typename T>
class Queue
{
public:
/*构造函数*/
Queue();
/*拷贝构造函数*/
Queue(const Queue<T>& others);
/*析构函数*/
~Queue();
/*判满 true 满 */
bool is_full();
/*判满 true 空*/
bool is_empty();
/*入队*/
void in_queue(T e);
/*出队*/
T out_queue();
/*清空队*/
void clear_queue();
/*求队的大小*/
void get_queueSize();
private:
T *data;
int font;
int tail;
};
#endif // QUEUE_H
queue.c
#include "queue.h"
template<typename T>
Queue<T>::Queue():data(new T [MAX]),tail(0),font(0)
{
memset(this->data,0,MAX);
cout<<"循环队列初始化成功"<<endl;
}
template<typename T>
Queue<T>::Queue(const Queue<T>& others):data(new T[MAX]),font(others.font),tail(others.tail)
{
//深拷贝
int f = this->font;
int t = this->tail;
while ((f+MAX)%MAX==t) {
this->data[f] = others.data[f];
f++;
}
cout<<"拷贝完成"<<endl;
}
template<typename T>
bool Queue<T>::is_full()
{
if((this->tail+1)%MAX == this->font){
return true;
}
return false;
}
template<typename T>
bool Queue<T>::is_empty()
{
if(this->font == this->tail){
return true;
}
return false;
}
template<typename T>
Queue<T>::~Queue()
{
//释放堆区数据
delete []data;
cout<<"析构完成"<<endl;
}
template<typename T>
void Queue<T>::in_queue(T e)
{
if(this->is_full() == true){
cout<<"队列满了"<<endl;
return ;
}
this->data[this->tail] = e;
this->tail = (this->tail+1)%MAX;
cout<<"入队成功"<<endl;
}
/*出队*/
template<typename T>
T Queue<T>::out_queue()
{
if(this->is_empty() == true){
cout<<"队列空,无元素"<<endl;
return NULL;
}
int temp = this->data[this->font];
this->font = (this->font+1)%MAX;
return temp;
}
template<typename T>
void Queue<T>::clear_queue()
{
if(this->is_empty() == true){
cout<<"队列空,无元素"<<endl;
return;
}
this->font = 0;
this->tail = 0;
}
template<typename T>
void Queue<T>::get_queueSize()
{
cout<<"队列的大小是:" <<(this->tail-this->font+MAX)%MAX<<endl;
}