Cpp/Qtday030908cpp基础

目录

目录

自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量

成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小

头文件: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;
}
效果图

思维导图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值