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