2022.12.9---标准模板库

本文介绍了如何手动实现栈和队列的数据结构。通过模板类的方式,实现了栈的基本操作如入栈、出栈、判断是否为空及获取栈顶元素等,并且实现了队列的基本操作如在队尾插入数据、从队头删除元素、判断是否为空及获取队首和队尾元素等。这些实现都考虑了异常处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手动实现封装栈,队列模板类

//模板栈
#include <iostream>
#include<stack>
#define N 20

using namespace std;

template<typename type>
class my_stack
{
private:
    type data[N];
    int last;
public:
    my_stack():last(0) {}       //无参构造
    bool empty(){return last==0?1:0;}   //判空
    void push(const type &val)      //入栈
    {
        if(last==N){
            throw string("stack full");     //异常处理机制,栈已满
        }
        last++;
        data[last]=val;
    }
    void pop()      //出栈
    {
        if(last){
            last--;
        }else{
            last=0;
        }
    }
    int size(){return last;}    //求栈大小
    type &top()     //返回栈顶元素
    {
        if(last){
            return data[last];
        }else{
            throw string("stack empty");       //异常处理机制,栈为空
        }
    }

};

int main()
{
    my_stack<int> s;        //s调用无参构造
    cout<<"s.empty:"<<s.empty()<<endl;  //判空
    for(int i=1;i<=10;i++)
    {
        try {
             s.push(i);          //往栈中写数据
        } catch (string e) {
            cout<<e<<endl;    //发出异常
        }
        try {
            cout<<s.top()<<" ";   //访问栈顶元素
        } catch (string e) {
            cout<<e<<endl;    //发出异常
        }

    }
    cout<<endl;
    cout<<"s.size:"<<s.size()<<endl;    //求栈大小
    cout<<"s.empty:"<<s.empty()<<endl;
    for(int i=1;i<=10;i++)
    {
        try {
            cout<<s.top()<<" ";
        } catch (string e) {
            cout<<e<<endl;
        }
        s.pop();        //移除栈顶元素
    }

    return 0;
}
//模板队列
#include <iostream>
#include<queue>
#define N 10

using namespace std;

template<typename type>

class my_queue
{
private:
    type data[N];
    int head;
    int tail;
public:
    my_queue():head(0),tail(0) {}       //无参构造
    bool empty(){return head==tail?1:0;}    //判空
    void push(const type &val)      //在队尾插入数据
    {
        if((tail+1)%N==head){
            throw string("queue full");
        }
        data[tail]=val;
        tail=(tail+1)%N;
    }
    void pop()      //从队头删除元素
    {
        if(head==tail){
            throw string("queue empty");
        }
        head=(head+1)%N;
    }
    int size(){return (tail-head+N)%N;}     //求队列大小
    type &front(){return data[head];}       //返回第一个元素
    type &back(){return data[tail-1];}       //返回最后一个元素
};

int main()
{
    my_queue<int> q;
    cout<<"q.empty:"<<q.empty()<<endl;
    for(int i=1;i<=10;i++)
    {
        try {
            q.push(i);
        } catch (string e) {
            cout<<e<<endl;
        }
    }
    cout<<"q.size:"<<q.size()<<endl;
    cout<<"q.front:"<<q.front()<<endl;
    cout<<"q.back:"<<q.back()<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值