这个是我课程设计的,比较粗糙的一个程序,有一些功能也不是很完善。看能不能给你一点帮助~~~
#include<iostream>
using namespace std;
#define OVERFLOW -2
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCRENT 10
#define NULL 0
struct SNode{
char CState;
int CNumber;
int CTime;
};//定义一个结构体结点
typedef struct {
SNode *base;
SNode *top;
int stacksize;
}SqStack;//分配栈的存储空间
typedef struct QNode{
SNode date;
struct QNode *next;
}QNode,*QueuePtr;//队列链表结点
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;//分配队列的存储空间
//////////////////////////////////////////////////
//函数的建立
int InitStack(SqStack &S){
//构造一个栈
S.base=new SNode[STACK_INIT_SIZE];
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int Push(SqStack &S,SNode e){
//入栈
*S.top++=e;
return OK;
}
int Pop(SqStack &S,SNode &e){
//出栈
if(S.top==S.base)return ERROR;
e=*--S.top;
return OK;
}
int InitQueue(LinkQueue &Q){
//建一个空队列
Q.front=Q.rear=new QNode;
Q.front->next=NULL;
return OK;
}
int EnQueue(LinkQueue &Q,SNode e){
//入队列
QNode *p;
p=new QNode;
if(!p)exit(OVERFLOW);
p->date=e;
Q.rear->next=p;
Q.rear=p;
return OK;
}
int DeQueue(LinkQueue &Q,SNode &e){
//出队列
if(Q.front==Q.rear) return ERROR;
QNode *p;
p=new QNode;
p=Q.front->next;
e=p->date;
Q.front->next=p->next;
if(Q.rear==p)Q.rear=Q.front;
delete(p);
return OK;
}
////////////////////////////////////////////
int main(){
SqStack S1,S2;
LinkQueue Q;
InitStack(S1);
InitStack(S2);
InitQueue(Q);
/*构造两个空栈S1,S2和一个队列Q*/
int n,price,i=1;
cout<<"停车场有多少个位置?"<<endl;
cin>>n;
cout<<"每分钟的价格是多少?"<<endl;
cin>>price;
SNode k;
do{
cout<<"输入信息"<<endl<<"汽车“到达”或“离去”信息(这里输入(A(到达) D(离去) E(结束))),汽车牌号码以及到达或离去的时刻"<<endl;
cin>>k.CState>>k.CNumber>>k.CTime;
if(k.CState!='A'&&k.CState!='D'&&k.CState!='E'){
cout<<"输入错误,请重新输入"<<endl;
continue;
}
if(k.CState=='A'){
if(S1.top-S1.base>=n){
EnQueue(Q,k);
cout<<"停车场已满,车子放在便道上的"<<i++<<"号位上"<<endl;
}//如果栈满,入队列并输出在便道上几号位
else {
Push(S1,k);//K入栈
cout<<"车子放在停车场的"<<S1.top-S1.base<<"号位上"<<endl;
}
}//到达状态的处理
else if(k.CState=='D'){
SNode e,a,g;
while(1){
Pop(S1,e);//删除栈顶元素,返回一个e
if(e.CNumber==k.CNumber){//如果返回的车牌和输入的车牌一样就输出停留时间和所需费用
int time,money;
time=k.CTime-e.CTime;
money=time*price;
cout<<k.CNumber<<"号车停留时间为"<<time<<endl;
cout<<"应缴纳的费用为"<<money<<"元"<<endl;
while(S2.top-S2.base!=0){//S2不空就把S2的元素给S1
Pop(S2,a);
Push(S1,a);
}//while
while(S1.top-S1.base<n&&Q.front!=Q.rear){//栈S1不空,就从队列中取出元素放入S1中,直到栈s1满或队列中没有元素了
DeQueue(Q,g);
i--;
Push(S1,g);
}//while
break;//当弹出的e和我们输入的k车牌号一样时跳出循环体
}//if
else Push(S2,e);//当弹出的e和我们输入的k车牌号不一样时,e入栈s2且继续循环体
}//while
}//离去状态的处理
}while(k.CState!='E');//当状态为结束时 结束输入
return 0;
}//main
参考资料:数据结构
本回答被提问者采纳