数据结构——栈与队列

数据结构——栈与队列


栈是一种后进先出结构,可以根据改变栈状态和检测栈状态的操作来定义栈,包括清空栈,判断栈是否为空,将元素放入栈顶,弹出栈顶元素,获取栈顶元素但不删除该元素。适用于数据存储后以相反的顺序检索的情况,一个应用是在程序中匹配分隔符。
栈的链表实现

template<class Type>
class Stack
{
    public:
    Stack(){}
    bool IsEmpty() const
    {
        return m_list.empty();
    }
    void Clear()
    {
        m_list.clear();
    }
    void Push(const Type& info)
    {
        m_list.push_back(info);
    }
    Type Pop()
    {
        Type info=m_list.back();
        m_list.pop_back();
        return info;
    }
    Type& Top()
    {        
        return m_list.back();
    }
    private:
    list<Type> m_list;
};

队列
队列是一种先进先出结构,队列是一个简单的排队序列,在队列尾部添加元素,在队列头部删除元素,是一种使用两端的结构。队列常用于模拟,如排队论,用队列建立模型。
队列的链表实现(双向链表)

template<class Type>
class Queue
{
    public:
    Queue(){}
    bool IsEmpty() const
    {
        return m_list.empty();
    }
    void Clear()
    {
        m_list.clear();
    }
    void Push(const Type& info)
    {
        m_list.push_back(info);
    }
    Type Pop()
    {
        Type info=m_list.front();
        m_list.pop_front();
        return info;
    }
    Type& Top()
    {        
        return m_list.front();
    }
    private:
    list<Type> m_list;
};

银行排队服务示例

int Function(int para[])
{
    int idx=0, num=rand()%100+1, paraRef;
    for(paraRef=para[0];paraRef<num;paraRef=para[idx+1],idx++);
    return idx;
}
int main()
{
    int arrivals[]={15, 20, 25, 10, 30};  //每分钟顾客数及所占百分比,数组下标为顾客数
    //服务时间及所占百分比,数组下标为服务时间的十分之一
    int services[]={0, 0, 0, 10, 5, 10, 10, 0, 15, 25, 10, 15};
    //职员需要服务时间及员工数量信息
    int clerks[]={0, 0, 0, 0}, numOfClerks=sizeof(clerks)/sizeof(int);
    int customers, t, i, x, numOfMinutes=100;
    double maxWait=0.0, curWait=0.0, thereIsLine=0.0;
    Queue<int> simulQ;
    cout.precision(2);
    for(t=1;t<=numOfMinutes;t++)
    {
        for(i=0;i<numOfClerks;i++)
        {
            if(clerks[i]<60)
            {
                clerks[i]=0;
            }
            else
            {
                clerks[i]-=60;
            }
        }
        customers=Function(arrivals);
        for(i=0;i<customers;i++)
        {
            x=Function(services)*10;
            simulQ.enqueue(x);
            curWait+=x;
        }
        for(i=0;i<numOfClerks&&!simulQ.IsEmpty();)
        {
            if(clerks[i]<60)
            {
                x=simulQ.dequeue();
                clerks[i]+=x;
                curWait-=x;
            }
            else
            {
                i++;
            }
        }
        if(!simulQ.IsEmpty())
        {
            thereIsLine++;
            if(maxWait<curWait)
            { 
                maxWait=curWait;
            }
        }
    }
    cout<<"\nFor"<<numOfClerks<<"clerks, there was a line"
        <<thereIsLine/numOfMinutes*100<<"% of the time;\n"
        <<"Max wait time was"<<maxWait/60.0<<"min."
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值