这是一个栈和队列一起应用的问题,栈先进后出,队,先进先出。在停车场的门口,如果停车场内出去一辆车,队列有车要进去,进去后,队的第一个数据发生变化,没车就直接减减。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 200004
#define MAXN1 1000004
typedef struct node
{
char num[24];
}st;//输入的一串数字,用字符串输入,因为它可能是栈也可能是队,所以用一个结构体,连接;
st stack[MAXN], link[MAXN1]; //定义的栈和队,中括号里面是尺寸大小;
int top, front, rear, n, m, flag;
void Add()
{
if(top < n - 1)//栈不满时,放在栈里,满了,放在队里;
scanf("%s",stack[++top].num);//++tio先加后用。
else
scanf("%s",link[rear++].num);//rear++先用后加;
}
void Del()
{
if(top == -1)//如果栈空,标记一下;
flag = 0;
else
{
if(rear > front)//如果队里有数,让队的第一个数赋给栈的最后一个,覆盖掉,然后front++,表示原来的front下的数被抛弃;
{
stack[top] = link[front];
front++;
}
else//如果队里没数,直接栈里减减;
top--;
}
}
void Out()
{
if(rear > front)//如果队里有数,第一个数被抛弃;
front++;
else//如果队里没数,标记一下
flag = 0;
}
void Pri()
{
for(; top >= 0; top--)//top从当前值开始倒序输出;
printf("%s\n",stack[top].num);
}
int main()
{
char s[9];
while(~scanf("%d%d",&n,&m))
{
top = -1, flag = 1, front = rear = 0;//top是先加后用,front是先用后加,赋初始值不一样;
while(m--)
{
scanf("%s",s);
{
if(!strcmp(s,"Add"))
Add();
else
if(!strcmp(s,"Del"))
Del();
else
if(!strcmp(s,"Out"))
Out();
}
}
if(flag)
Pri();//如果flag = 1,可以输出;
else
printf("Error\n");//如果flag =0;表示有错误命令,直接输出Error;
}
return 0;
}