数据结构实验之栈与队列十一:refresh的停车场

来源:互联网 发布:绿联hdmi网络传输器 编辑:程序博客网 时间:2024/06/06 08:27

Problem Description
refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先
进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,
Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.
Input
输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。
Output
输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最先输出,无车辆不输出。
Example Input
2 6
Add 18353364208
Add 18353365550
Add 18353365558
Add 18353365559
Del
Out
Example Output
18353365558
18353364208

//此题:栈的容量有规定!!!#include <stdio.h>#include <stdlib.h>#include <string.h>#define stackmax 10000#define stacknum 100#define OK 1#define ERROR 0#define OVERFLOW -2#define true 1#define false 0typedef int status;typedef long long int selemtype;typedef long long int qelemtype;typedef struct{    selemtype *base;    selemtype *top;    int stacksize;} sqstack;typedef struct queue//结点定义{    qelemtype data;    struct queue *next;} qneue,*queueptr;typedef struct{    queueptr front;//队头指针    queueptr rear;//队尾指针} linkqueue;int initstack(sqstack &S,int n)//构造一个空栈{    S.base=new selemtype[n];    if(!S.base)        exit(OVERFLOW);    S.top=S.base;    return OK;}int push(sqstack &S,selemtype e){    /*if(S.top-S.base>=S.stacksize)    {        S.base=(selemtype *)realloc(S.base,(S.stacksize+stacknum)*sizeof(selemtype));        if(!S.base)            exit(OVERFLOW);        S.top=S.base+S.stacksize;        S.stacksize+=stacknum;    }*/    *(S.top)=e;    S.top++;    return OK;}int pop(sqstack &S,selemtype &e){    if(S.base==S.top)        return ERROR;    e=*--S.top;    return OK;}status isempty(sqstack S){    if(S.base==S.top)        return true;    else        return false;}status initqueue(linkqueue &Q){    Q.front=Q.rear=new queue;    if(!Q.front)        exit(OVERFLOW);    Q.front->next=NULL;    return OK;}status enqueue(linkqueue &Q,qelemtype e){    queueptr p=new queue;    if(!p)        exit(OVERFLOW);    p->data=e;    p->next=NULL;    Q.rear->next=p;    Q.rear=p;    return OK;}status dequeue(linkqueue &Q,qelemtype &e)//用e返回删除掉的队头元素{    if(Q.front==Q.rear)        return ERROR;    queueptr p=Q.front->next;    e=p->data;    Q.front->next=p->next;    if(Q.rear==p)//如果是最后一个元素被删,队尾指针也丢失了,因此对队尾指针重新赋值        Q.rear=Q.front;    free(p);    return OK;}status qempty(linkqueue Q){    if(Q.rear==Q.front)        return true;    else        return false;}int main(){    int m,n;//n为栈的容量    while(~scanf("%d %d",&n,&m))    {        sqstack S;        initstack(S,n);//n为栈的容量!!栈的容量是规定的        linkqueue Q;        initqueue(Q);        bool flag=false;        selemtype e;        char s[10];        long long int num;        while(m--)        {            scanf("%s",s);//空格即为结束此字符串的输入            if(strcmp(s,"Add")==0)            {                scanf("%lld",&num);                if(S.top-S.base<n)//有剩余车位。判断栈满。n为栈的容量                {                    push(S,num);                }                else                {                    enqueue(Q,num);                }            }            else if(strcmp(s,"Del")==0)            {                if(isempty(S))                {                    flag=true;                }                else                {                    pop(S,e);                    if(!qempty(Q))                    {                        qelemtype temp;                        dequeue(Q,temp);                        push(S,temp);                    }                }            }            else if(strcmp(s,"Out")==0)            {                if(qempty(Q))                {                    flag=true;                }                qelemtype temp;                dequeue(Q,temp);            }        }        if(flag)            printf("Error\n");        else        {            while(!isempty(S))//if还是while的区别            {                pop(S,e);                printf("%lld\n",e);            }        }    }}
WA:#include <iostream>//c++ 里面使用 栈 需要添加 #include<stack>头文件,使用队列添加#include <queue> 头文件,并且必须在#include <iostream> 头文件下进行使用#include <stack>#include <queue>#include <string.h>#include <cstring>#include <stdlib.h>#include <algorithm>using namespace std;//s.size(),p.size() 可以动态的知道目前 栈和队列里面有几个元素。s.pop(), p.pop():表示 栈删除栈顶元素,队删除队列的第一个元素。//s.top()表示栈的栈顶元素值的大小,p.front()表示 队列的第一个元素的值的大小。int main(){    int n,m;    string a,b;    while(cin>>n>>m)    {        int flag=1;        stack<string>s;        queue<string>q;        for(int i=0; i<m; i++)        {            cin>>a;            if(a=="Add")            {                cin>>b;                if(s.size()<n)                {                    s.push(b);                }                else                    q.push(b);            }            else if(a=="Del")            {                if(s.size()==0)//停车场,没车                {                    flag=0;                    break;                }                else                {                    s.pop();                   if(!q.empty())//通道内有车                   {                     s.push(q.front());                     q.pop();                   }                }            }            else if(a=="Out")            {                if(q.size()==0)//通道内无车                {                    flag=0;                    break;                }                else                {                    q.pop();                }            }        }        if(flag==0)            cout<<"Error"<<endl;        else        {            while(!s.empty())//栈不空            {                cout<<s.top()<<endl;                s.pop();            }        }    }    return 0;}
阅读全文
0 0