作业:1、手动实现stack部分功能
2、手动实现queue部分功能
1、
头文件
#ifndef HEAD_H
#define HEAD_H
#include <iostream>
#include<cstring>
#define MAX 10
using namespace std;
class Stack
{
private:int* data; //存储栈的容器,指向堆区空间int top; //记录栈顶下标的元素int max; //记录栈的最大容量
public:Stack(); //无参构造Stack(int); //有参构造~Stack(); //析构函数Stack& operator=(Stack& other); //赋值函数int& mytop();//判空bool empty();//size 返回容纳的元素数int mysize();//栈顶插入void mypush(int);//出栈Stack& mypop();
};#endif // HEAD_H
源文件
#include"head.h"
Stack ::Stack() //无参构造
{data = new int[MAX];max = MAX;top = -1;cout<<"无参构造了一个容量为10的栈"<<endl;
}
Stack ::Stack(int num) //有参构造
{data = new int[num];max = num;top = -1;cout<<"有参构造了一个容量为"<<num<<"的栈"<<endl;
}
Stack ::~Stack() //析构函数
{top = -1;delete[] data;data=NULL;cout<<"析构函数调用"<<endl;
}
//赋值函数
Stack& Stack ::operator=(Stack& other)
{if(this!=&other) //自检{delete [] data;data = new int[other.max];this->top=other.top;this->max = other.max;for(int i=0;i<max;i++){data[i]=other.data[i];}}cout<<"赋值函数调用"<<endl;return *this;}
//访问栈顶元素
int& Stack :: mytop()
{return data[top];
}
//判空
bool Stack ::empty()
{return top==-1;
}
//size 返回容纳的元素数
int Stack :: mysize()
{return top+1;
}
//栈顶插入
void Stack ::mypush(int value)
{//插入逻辑if((top+1)<=max) //未满{data[++top] = value;}else{cout<<"栈已满"<<endl;}
}
//出栈
Stack& Stack::mypop()
{//出栈逻辑if(empty()){cout<<"栈已空"<<endl;}else{top--;}return *this;
}
main
#include"head.h"
int main()
{Stack s1; //无参构造s1.mypush(1); //调用入栈s1.mypush(12);s1.mypush(3);s1.mypush(99);cout<<"s1.szie ="<<s1.mysize()<<endl; //调用sizecout<<"s1 栈顶为"<<s1.mytop()<<endl; //调用topcout<<"**********************************************"<<endl;Stack s2(5); //有参构造s2=s1; //赋值函数cout<<"s2.szie ="<<s2.mysize()<<endl;cout<<"s2 栈顶为"<<s2.mytop()<<endl;s2.mypop(); //调用出栈cout<<"s2 栈顶为"<<s2.mytop()<<endl;return 0;
}
2、
头文件
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
#define MAX 10
using namespace std;
class Queue
{
private:int *data; //存储队列的容器int front; //记录队头下标int tail; //记录队尾下标int capacity; //记录队列最大容量
public:Queue(); //无参构造Queue(int); //有参构造~Queue(); //析构函数Queue& operator=(Queue &other); //赋值函数int& myfront(); //访问第一个元素int& mytail(); //访问最后一个元素bool empty(); //判空bool full(); //判满int getsize(); //获取当前元素数量void mypush(int); //入队Queue& mypop(); //出队void queue_show();
};
#endif // QUEUE_H
源文件
#include"queue.h"//无参构造
Queue ::Queue()
{data = new int[MAX];front = tail =0;capacity = MAX;cout<<"无参构造了容量为"<<capacity<<"的队列"<<endl;
}
Queue ::Queue(int max) //有参构造
{data= new int[max];front = tail =0;capacity = max;cout<<"有参构造了容量为"<<capacity<<"的队列"<<endl;
}
Queue:: ~Queue() //析构函数
{delete []data;cout<<"析构函数调用成功"<<endl;
}
Queue& Queue ::operator=(Queue &other) //赋值函数
{if(this!=&other) //自检{delete [] data;data = new int[other.capacity];this->front=other.front;this->tail = other.tail;this->capacity=other.capacity;for(int i=front;i!=tail;i=(i+1)%capacity){data[i]=other.data[i];}}cout<<"赋值函数调用"<<endl;return *this;
}
int& Queue ::myfront() //访问第一个元素
{return data[front];
}
int& Queue ::mytail() //访问最后一个元素
{return data[tail-1];
}//判空
bool Queue ::empty()
{return front==tail;
}
//判满
bool Queue ::full()
{return (tail+1)%capacity==front;
}
//获取当前元素数量
int Queue ::getsize()
{return (tail-front+capacity)%capacity;
}
//入队
void Queue ::mypush(int value)
{if(full()){cout<<"队列满"<<endl;}else{data[tail]=value;tail= (tail+1)%capacity;}
}
//出队
Queue& Queue ::mypop()
{if(empty()){cout<<"队列已空"<<endl;}else{front = (front+1)%capacity;}return *this;
}
void Queue ::queue_show()
{if(empty()){cout<<"队列为空"<<endl;}else{cout<<"队列中的元素为:";for(int i=front;i!=tail;i=(i+1)%capacity){cout<<data[i]<<'\t';}cout<<endl;}
}
主文件
#include"queue.h"int main()
{Queue q1;q1.mypush(3);q1.mypush(2);q1.mypush(4);q1.mypush(5);q1.mypush(1);cout<<"队列第一个元素为:"<<q1.myfront()<<endl;cout<<"队列最后一个元素为:"<<q1.mytail()<<endl;cout<<"队列中有:"<<q1.getsize()<<"个元素"<<endl;cout<<"***************************************************"<<endl;Queue q2(4);q2.mypop();q2=q1;q2.queue_show();q2.mypop();q2.queue_show();cout<<"***************************************************"<<endl;return 0;
}
效果图
思维导图