C++封装:栈、队列
栈的封装:
#include <iostream>using namespace std;//封装栈
class myStack
{
private:int *data;int top=-1; //记录栈顶元素下标int size; //栈的大小
public:myStack():size(10){data = new int[size];top=-1;}myStack(int size){data = new int[size];top=-1;this->size=size;}~myStack(){delete []data;}//operator=myStack &operator=(const myStack &other){//防止自己给自己赋值if(this==&other){return *this;}//释放当前空间delete []data;//重新分配内存size=other.size;data=new int[size];for(int i=0;i<size;i++){data[i]=other.data[i];}top=other.top;return *this;}//访问栈顶元素int my_top(){return data[top];}//判空bool my_empty(){return top==-1;}//判满bool my_full(){return top==size-1;}//返回容纳的元素数int my_size(){return size;}//向栈顶插入元素void my_push(int a){//判断栈是否已经满if(my_full()){cout<<"入栈失败!"<<endl;return ;}//入栈top++;data[top]=a;cout<<"入栈成功!"<<endl;}//删除栈顶元素void my_pop(){if(my_empty()){cout<<"出栈失败!"<<endl;return ;}//判断是否为空cout<<data[top]<<"出栈成功!"<<endl;top--;}//遍历栈void show(){for(int i=0;i<=top;i++){cout<<data[i]<<" ";}cout<<endl;}};int main()
{//插入myStack s;s.my_push(5);s.my_push(8);s.my_push(3);s.my_push(10);s.show();cout << "**************************" << endl;//删除s.my_pop();s.my_pop();s.show();cout << "**************************" << endl;//赋值myStack s1;s1=s;s1.show();cout << "**************************" << endl;//访问栈顶cout<<s.my_top()<<endl;return 0;
}
队列的封装:
#include <iostream>using namespace std;//封装队列
class myQueue
{
private:int *data; //队列容器int size; //容器大小int front; //队头下标int back; //队尾下标
public:myQueue():size(15){data = new int[size];size=15;front=0;back=0;}myQueue(int size){data = new int[size];this->size=size;front=0;back=0;}~myQueue(){delete []data;}//operator=myQueue &operator=(const myQueue &other){//防止自己给自己赋值if(this==&other){return *this;}//释放当前空间delete []data;//重新分配内存size=other.size;data=new int[size];for(int i=0;i<size;i++){data[i]=other.data[i];}front=other.front;back=other.back;return *this;}//判空bool my_empty(){return front==back;}//判满bool my_full(){return (back+1)%size==front;}//访问当一个元素int get_front(){if(my_empty()){cout<<"访问失败!"<<endl;return -1;}return data[front];}//访问最后一个元素int get_back(){if(my_empty()){cout<<"访问失败!"<<endl;return -1;}//back=0,表示最后一个元素在末尾if(back==0){return data[size-1];}return data[back-1];}//返回容纳的元素个数int my_size(){return size;}//尾插void my_push(int a){if(my_full()){cout<<"入队失败!"<<endl;return ;}//入队data[back]=a;//队列变化back=(back+1)%size;cout<<"入队成功!"<<endl;}//头删void my_pop(){if(my_empty()){cout<<"出队失败!"<<endl;return ;}cout<<"出队成功!"<<endl;//队头变化front=(front+1)%size;}//遍历void show(){if(my_empty()){cout<<"遍历失败!"<<endl;}for(int i=front;i!=back;i=(i+1)%size){cout<<data[i]<<" ";}cout<<endl;}};int main()
{myQueue q(10);//入队q.my_push(23);q.my_push(22);q.show();//访问首尾元素cout<<"首"<<q.get_front()<<endl;cout<<"尾"<<q.get_back()<<endl;//赋值myQueue q2;q2=q;q2.show();//出队q.my_pop();q.show();return 0;
}
复习:栈和队列的区别
栈(Stack)和队列(Queue)是两种常见的数据结构。
1. 规则与操作特性
队列:先进先出,就是最先进入队列的元素将最先被移除。主要有入队和出队两种操作。入队操作在队列的尾部添加元素,而出队操作则从队列的头部移除元素。
栈:后进先出,就是最后进入栈的元素将最先被移除。主要支持入栈和出栈两种操作。入栈和出栈都是在栈顶
2. 指针与结构
队列:通常有两个指针,一个指向队首用于出队操作;另一个指向队尾,用于入队操作。这有助于区分队列的头部和尾部,从而保持FIFO的特性。
栈:只有一个指针,指向栈顶,用于入栈和出栈操作。栈顶是栈中最后添加或即将被移除的元素的位置。
思维导图: