DAY48

 

#ifndef QUEUE_H
#define QUEUE_H

#include<iostream>

using namespace  std;

#define MAX 10

typedef int datatype;

template <typename T>
class queue
{

    T data[MAX];
    T front;
    T tail;


public:
    queue();

    ~queue();

    queue(const T &other);

    //创建循环队列
    T *queue_create();

    //判空
    int queue_empty(queue *q);

    //判满
    int queue_full(queue *q);

    //入队
    int queue_push(queue *q,T e);

    //遍历
    void queue_show(queue *q);

    //出队
    int queue_pop(queue *q);

    //求队列的长度
    int queue_size(queue *q);

    //销毁
    void queue_free(queue *q);

};


#endif // QUEUE_H
#include"queue.h"

template <typename T>
queue<T>::queue()
{
    cout << "queue:无参构造" << endl;
}

template <typename T>
queue<T>::~queue()
{

    cout << "queue::析构函数" << this << endl;
}

template <typename T>
queue<T>::queue(const T &other):front(other.front),tail(other.tail)
{
    cout << "拷贝构造函数" << endl;
}

//创建循环队列
template <typename T>
T *queue<T>::queue_create()
{
    queue * q = (queue *)malloc(sizeof(queue));
    if(NULL == q)
    {
        printf("创建失败\n");
        return NULL;
    }


    q -> front = q -> tail = 0;

    printf("创建成功\n");
    return q;
}


//判空
template <typename T>
int queue<T>::queue_empty(queue * q)
{
    if(NULL == q)
    {
        printf("队列错误\n");
        return 0;
    }

    return q -> front == q -> tail;
}


//判满
template <typename T>
int queue<T>::queue_full(queue *q)
{
    if(NULL == q)
    {
        printf("队列错误\n");
        return 0;
    }

    return (q -> tail + 1) % MAX == q -> front;
}


//入队
template <typename T>
int queue<T>::queue_push(queue *q,T e)
{
    if(NULL == q)
    {
        printf("入队失败\n");
        return 0;
    }

    q -> data[q -> tail] = e;
    q -> tail = (q ->tail + 1) % MAX;
    printf("入队成功\n");
    return 1;
}




//遍历
template <typename T>
void queue<T>::queue_show(queue *q)
{
    if(NULL == q || queue_empty(q))
    {
        printf("遍历失败\n");
        return;
    }

    printf("从队头到队尾元素分别是: ");
    for(int i = q -> front; i != q -> tail; i = (i + 1) % MAX)
    {
        printf("%d\t",q -> data[i]);
    }
    printf("\n");
}



//出队
template <typename T>
int queue<T>::queue_pop(queue * q)
{
    if(NULL == q)
    {
        printf("出队失败\n");
        return 0;
    }

    cout << "出队的元素是: ";
    printf("%d\n",q -> data[q -> front]);
    q -> front = (q -> front + 1) % MAX;

    return 1;
}

//求队列的长度
template <typename T>
int queue<T>::queue_size(queue * q)
{
    if(NULL == q)
    {
        printf("不合法\n");
        return 0;
    }

    return (q -> tail + MAX - q -> front) % MAX;
}



//销毁
template <typename T>
void queue<T>::queue_free(queue * q)
{
    if(NULL == q)
    {
        printf("销毁失败\n");
        return ;
    }

    free(q);
    q = NULL;
    printf("释放成功\n");
    return ;
}
#include "queue.h"

using namespace std;

template <typename T>
int main()
{
    queue<T> u;
    queue<T> *q = u.queue_create();
    if(NULL == q)
    {
        return -1;
    }


    //入队

    u.queue_push(q,"aafa");
    u.queue_push(q,9);
    u.queue_push(q,3);
    u.queue_push(q,7);
    u.queue_push(q,4);
    u.queue_push(q,1);


    u.queue_show(q);

    //出队
    u.queue_pop(q);

    u.queue_show(q);

    //求队列大小
    u.queue_size(q);

    //清空且销毁
    u.queue_free(q);


    return 0;
}

#ifndef STACK_H
#define STACK_H

#include <iostream>
#include <cstring>

using namespace std;

typedef int datatype;

template <typename T>
class stack
{
    T * data;
    T top;

public:
 stack();

 ~stack();

 stack(const T &other);

 //创建栈
 T *Stack_create();


 //判空
 T Stack_empty(T *s);


 //判满
 T Stack_full(T *s);


 //入栈
 T Stack_push(T *s,T e);


 //遍历栈
 T Stack_show(T *s);


 //出栈
 T Stack_pop(T *s);


 //获取栈顶元素
 T * Stack_top(T *s);


 //求栈的大小
 T Stack_size(T *s);


 //销毁栈
 T Stack_free(T *s);



};

#endif // STACK_H
#include"stack.h"

template <typename T>
stack<T>::stack():data(new T(111))
{
    cout << "stack::无参构造" << endl;
}

template <typename T>
stack<T>::~stack()
{
    delete data;
    cout << "stack::析构函数:" << this << endl;
}




//创建栈
template <typename T>
T * stack<T>::Stack_create()
{
    stack * s = (stack *)malloc(sizeof(stack));
    if(NULL == s)
    {
        cout << "申请失败" << endl;
        return NULL;
    }

    s -> data = (datatype *)malloc(sizeof(datatype) * 10);
    if(NULL == s -> data)
    {
        cout << "申请失败" << endl;
        free(s);
        return NULL;
    }

    s -> top = -1;
    printf("创建成功\n");
    return s;

}


//判空
template <typename T>
T stack<T>::Stack_empty(T *s)
{
    if(NULL == s)
        {
            printf("栈不合法\n");
            return 0;
        }
        return s -> top == -1;

}


//判满
template <typename T>
T stack<T>::Stack_full(T *s)
{
    if(NULL == s)
    {
        printf("栈不合法\n");
        return 0;
    }
    return s -> top == 10 - 1;

}


//入栈
template <typename T>
T stack<T>::Stack_push(T * s,T e)
{
    if(NULL == s || Stack_full(s))
    {
        printf("入栈失败\n");
        return 0;
    }

    s -> top++;
    s -> data[s -> top] = e;
    printf("入栈成功\n");
    return 1;

}


//遍历栈
template <typename T>
T stack<T>::Stack_show(T *s)
{
    if(NULL == s || Stack_empty(s))
    {
        printf("遍历失败\n");
        return ;
    }

    printf("从栈顶到栈底的元素分别是: \n");
    for(int i = s -> top; i >= 0; i--)
    {
        printf("%d\t",s -> data[i]);
    }
    printf("\n");

}


//出栈
template <typename T>
T stack<T>::Stack_pop(T * s)
{
    if(NULL == s || Stack_empty(s))
        {
            printf("出栈失败\n");
            return 0;
        }

        datatype e = s -> data[s -> top];
        printf("%d",e);
        s -> top--;
        return 1;

}


//获取栈顶元素
template <typename T>
T * stack<T>::Stack_top(T *s)
{
    if(NULL == s || Stack_empty(s))
        {
            printf("获取失败\n");
            return NULL;
        }

        return &s -> data[s -> top];

}


//求栈的大小
template <typename T>
T stack<T>::Stack_size(T *s)
{
    if(NULL == s)
    {
        printf("求取失败\n");
        return 0;
    }
    return s -> top + 1;

}


//销毁栈
template <typename T>
T stack<T>::Stack_free(T *s)
{
    if(NULL == s)
    {
        printf("不合法\n");
        return;
    }

    free(s -> data);
    s -> data = NULL;

    free(s);
    s = NULL;

    printf("释放成功\n");
    return ;

}
#include"stack.h"

template <typename T>
int  main()
{

    stack<T> k;
    T *s = k.Stack_create();
    if(NULL == s)
    {
        return -1;
    }
    datatype e;

    //入栈
    cout << "请输入一位栈底元素: ";
    cin >> e;
    k.Stack_push(s,e);
    k.Stack_push(s,2);
    k.Stack_push(s,5);
    k.Stack_push(s,6);
    k.Stack_push(s,4);
    k.Stack_push(s,8);


    //遍历栈
    k.Stack_show(s);

    //出栈
    k.Stack_pop(s);

    k.Stack_show(s);

    //求栈顶元素
    k.Stack_top(s);

    //求栈的大小
    k.Stack_size(s);

    //清空栈且销毁
    k.Stack_free(s);
    s = NULL;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

也许t

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值