目录
目录
自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量
成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小
头文件:stack.h
源文件: stack.cpp
测试文件:main.cpp
效果图
自行封装一个循环顺序队列的类,包含私有成员属性:存放队列的数组、队头位置、队尾位置
成员函数完成:构造函数、析构函数、拷贝构造函数、入队、出队、清空队列、判空、判满、求队列大小
头文件:queue.h
源文件: queue.cpp
测试文件:main.cpp
效果图
思维导图
自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量
成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小
头文件:stack.h
#ifndef STACK_H
#define STACK_H
#include <iostream>using namespace std;class Stack
{
private:int data[128];int top;
public:Stack();~Stack();Stack(Stack &s);//判空bool stack_empty();//返回布尔类型,真为空,假为非空//判满bool stack_full();//返回布尔类型,真为满,假为非满//入栈int stack_in(int num);//出栈int stack_out();//清空栈bool stack_clear();//获取栈顶元素int stack_get_top();//求栈的大小int stack_size();//为了便于观察现象,加一个展示栈内元素的函数,从栈顶向栈底void stack_show();
};#endif // STACK_H
源文件: stack.cpp
#include "stack.h"Stack::Stack():top(-1){cout<<"Stack:构造函数"<<endl;
}Stack::~Stack(){cout<<"Stack:析构函数"<<endl;
}Stack::Stack(Stack &s):top(s.top){for(int i=0; i<=top; i++){data[i] = s.data[i];}cout<<"Stack:拷贝构造函数"<<endl;
}
//判空
bool Stack::stack_empty(){//top正好记录栈顶元素的下标,所以当top为-1时,栈空return -1 == top;
}
//判满
bool Stack::stack_full(){//top正好记录栈顶元素的下标,所以当top为127时,栈满return 127 == top;
}
//入栈
int Stack::stack_in(int num){//如果栈满,则拒绝入栈if(Stack::stack_full()){cout<<"栈已满"<<endl;return -1;}//将栈顶变量的值+1,就能指向新的栈顶top++;//将要入栈的数据放入数组中data[top] = num;return 0;
}
//出栈
int Stack::stack_out(){//判断栈是否为空,为空则无法出栈if(Stack::stack_empty()){cout<<"栈已空"<<endl;return -1;}//按照我的定义,top正好记录了栈顶元素的下标,因此top--,会将top自减,并且top--这个表达式//的值为top,所以可以输出data[top]也就是栈顶元素的值,同时top自减一次,而要出栈,出的//就是栈顶元素return data[top--];
}
//清空栈
bool Stack::stack_clear(){//如果栈本身为空则无需清空if(Stack::stack_empty()){cout<<"栈已空"<<endl;return false;}//如果栈非空则需要清空//将栈顶指针置为-1即可top = -1;return true;
}
//获取栈顶元素
int Stack::stack_get_top(){//首先栈要非空if(Stack::stack_empty()){cout<<"栈已空"<<endl;return -1;}//原理与出栈相同,唯一的区别就是无需将栈顶变量移动return data[top];
}
//求栈的大小
int Stack::stack_size(){//已知,top变量记录了栈顶元素的下标,所以要求栈中的元素数量,只需将top+1就可得到return top+1;
}
//为了便于观察现象,加一个展示栈内元素的函数,从栈顶向栈底
void Stack::stack_show(){//首先栈要非空if(Stack::stack_empty()){cout<<"栈为空"<<endl;return ;}for(int i=top; i>-1; i--){cout << data[i] << " ";}cout<<endl;
}
测试文件:main.cpp
#include <iostream>
#include "stack.h"using namespace std;int main()
{Stack s1;//入栈s1.stack_in(4);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(3);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(9);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(6);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(1);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(5);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(5);//展示栈内元素cout<<"s1:";s1.stack_show();s1.stack_in(7);//展示栈内元素cout<<"s1:";s1.stack_show();//拷贝构造函数的使用Stack s2(s1);//展示栈内元素cout<<"s2:";s2.stack_show();//出栈cout<<s1.stack_out()<<"出栈成功"<<endl;//展示栈内元素cout<<"s1:";s1.stack_show();cout<<s1.stack_out()<<"出栈成功"<<endl;//展示栈内元素cout<<"s1:";s1.stack_show();cout<<s1.stack_out()<<"出栈成功"<<endl;//展示栈内元素cout<<"s1:";s1.stack_show();//获取栈的大小cout<<"此时栈内元素的数量为:"<<s1.stack_size()<<endl;//栈顶元素为cout<<"栈顶元素为:"<<s1.stack_get_top()<<endl;//清空栈s1.stack_clear();cout<<"栈清空成功"<<endl;//展示栈内元素cout<<"s1:";s1.stack_show();return 0;
}
效果图
自行封装一个循环顺序队列的类,包含私有成员属性:存放队列的数组、队头位置、队尾位置
成员函数完成:构造函数、析构函数、拷贝构造函数、入队、出队、清空队列、判空、判满、求队列大小
头文件:queue.h
#ifndef QUEUE_H
#define QUEUE_H#include <iostream>using namespace std;class Queue
{
private:int data[12];int head;int tail;public://构造函数Queue();//析构函数~Queue();//拷贝构造函数Queue(Queue &q);//判空bool queue_empty();//判满bool queue_full();//入队int queue_in(int num);//出队int queue_out();//清空队列bool queue_clear();//求队列大小int queue_size();//为了便于观察现象,加一个展示队列元素的函数,从队头到队尾void queue_show();
};#endif // QUEUE_H
源文件: queue.cpp
#include "queue.h"//构造函数
Queue::Queue():head(0),tail(0){cout<<"Queue:构造函数"<<endl;
}//析构函数
Queue::~Queue(){cout<<"Queue:析构函数"<<endl;
}//拷贝构造函数
Queue::Queue(Queue &q):head(q.head),tail(q.tail){int h = head;while(h!=tail){data[h] = q.data[h];h = (h+1)%12;}cout<<"Queue:拷贝构造函数"<<endl;
}//判空
bool Queue::queue_empty(){//当队列的头变量与尾变量的值相同时,队列为空return head == tail;
}//判满
bool Queue::queue_full(){//队尾变量记录的下标中是不保存变量的,以便操作与计数//因此,当队尾变量的值比对头变量的值小1或者-11的时候,队满return (tail+1)%12 == head;
}//入队
int Queue::queue_in(int num){//要能入队,首先队列不能为满if(Queue::queue_full()){cout<<"队列已满,无法入队"<<endl;return -1;}//此时可以入队data[tail] = num;//队尾变量自增一次tail = (tail + 1)%12;return 0;
}//出队
int Queue::queue_out(){//要能出队,首先队列不能为空if(Queue::queue_empty()){cout<<"队列已空,无法入队"<<endl;return -1;}//此时可以出队int tmp = data[head];//对头变量自增一次head = (head + 1)%12;return tmp;
}//清空队列
bool Queue::queue_clear(){//若队列为空则无需清空if(Queue::queue_empty()){cout<<"队列已空,无需清空"<<endl;return false;}//操作队头队尾变量,使满足队列为空的条件head = tail;return true;
}//求队列大小
int Queue::queue_size(){//根据队首队尾的位置即可求出队列大小return (tail + 12 - head)%12;
}//为了便于观察现象,加一个展示队列元素的函数,从队头到队尾
void Queue::queue_show(){//若队列为空则提示队列为空if(Queue::queue_empty()){cout<<"队列为空"<<endl;return;}int h = head;while(h!=tail){cout<<data[h]<<" ";h = (h+1)%12;}cout<<endl;return;
}
测试文件:main.cpp
#include <iostream>
#include "queue.h"
using namespace std;int main()
{Queue q1;//入队q1.queue_in(4);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(3);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(9);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(6);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(1);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(5);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(5);//展示cout<<"q1: ";q1.queue_show();//入队q1.queue_in(7);//展示cout<<"q1: ";q1.queue_show();//拷贝构造函数Queue q2(q1);//展示cout<<"q2: ";q2.queue_show();//出队cout<<q1.queue_out()<<"出队成功"<<endl;//出队cout<<q1.queue_out()<<"出队成功"<<endl;//出队cout<<q1.queue_out()<<"出队成功"<<endl;//展示cout<<"q1: ";q1.queue_show();//求队列大小cout<<"q1队列大小为"<<q1.queue_size()<<endl;//清空队列q1.queue_clear();cout<<"队列清空成功"<<endl;//展示cout<<"q1: ";q1.queue_show();//求队列大小cout<<"q1队列大小为"<<q1.queue_size()<<endl;return 0;
}