棧:棧就是先進后出,比如我把數(shù)字3询枚、5违帆、2放入棧中,然后第一次從棧中取出來的數(shù)字是2金蜀,然后取出來的數(shù)字是5刷后,這時如果再向棧中放入數(shù)字9,下一次取出來的數(shù)字是9渊抄,再下次取出來的數(shù)字是3尝胆,這時候棧空了护桦。椇危可以想象成一個大坑,先放進去的東西在下面二庵,后放進去的東西在上面贪染,取東西時上面的東西先被取出來。
用數(shù)組模擬棧:
int stack[100], t;
void push(int x) {
stack[t++] = x;
}
int pop() {
return stack[--t];
}
隊列:隊列就是先進后出催享,就像排隊一樣杭隙,先到的人先出來。比如把3因妙、5痰憎、2放入隊列中票髓,第一次出隊的數(shù)是3,然后是5信殊,接下來讓9入隊炬称,下一個出隊的數(shù)是2,再下一個出隊的數(shù)是9涡拘,然后隊列空玲躯。
用數(shù)組模擬隊列:
int queue[100], head, tail;
void push(int x) {
queue[tail++] = x;
}
int front() {
return queue[head];
}
void pop() {
head++;
}
#include<cstdio>
#include<cstring>
int a[100010][3],n,m;
//a[i][2]表示學(xué)號為i的同學(xué)右邊同學(xué)的學(xué)號
//a[i][3]表示學(xué)號為i的同學(xué)左邊同學(xué)的學(xué)號
int main()
{
scanf("%d",&n); int j=1;
memset(a,0,sizeof(a)); a[1][1]=1;
for(int i=2;i<=n;i++)
{
int x,y; scanf("%d %d",&x,&y);
a[i][1]=i;
if(y==0)
//插入左邊
{
a[a[x][3]][2]=i; a[i][2]=x;
a[i][3]=a[x][3]; a[x][3]=i;
if(x==j) j=i;
//比較麻煩,要改鏈表
}
else
//插入右邊
{
a[i][2]=a[x][2]; a[a[x][2]][3]=i;
a[x][2]=i; a[i][3]=x;
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x; scanf("%d",&x);
if(a[x][1]!=0)
//該同學(xué)還在
{
a[x][1]=0;
//踢掉……(好可憐)
a[a[x][3]][2]=a[x][2];
a[a[x][2]][3]=a[x][3];
n--;
if(x==j) j=a[x][3];
}
}
int i=1,x=j;
while(i<=n)
{
printf("%d ",a[x][1]);
x=a[x][2]; i++;
}
return 0;
}