栈例题-火车车厢重组

一组火车车厢编号1-n

从右向左经过车站

每节车厢可以临时进站(栈),放过主线上的几节车厢后再重新上路跟上。

输入车厢数和希望得到的车厢顺序,判断是否可能。

CCF教材下册P149,例6.9

代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std;
 6 struct Stack
 7 {
 8     int a[100];
 9     int p;
10 };
11 bool isempty(Stack *s)
12 {
13     return s->p==-1;
14 }
15 void push(Stack *s,int x)
16 {
17     s->p++;
18     s->a[s->p]=x;
19 }
20 int pop(Stack *s)
21 {
22     if(!isempty(s))
23     {
24         return s->a[s->p--];
25     }
26     else
27     {
28         //cout<<"The stack is empty";
29         return -1;
30     }
31 }
32 int gettop(Stack *s)
33 {
34     if(!isempty(s))
35     {
36         return s->a[s->p];
37     }
38     else
39     {
40         //cout<<"The stack is empty";
41         return -1;
42     }
43 }
44 main()
45 {
46     Stack *mystack=new Stack;
47     int a[100]={0},b[100]={0},n,*p1,*p2;//a为目的序列,b为初始序列,b火车从右向左经过车站
48     bool flag=true;
49     mystack->p=-1;
50     p1=a;
51     p2=b;
52     //初始化开始
53     cin>>n;
54     for(int i=0; i<n; i++)
55     {
56         b[i]=i+1;
57     }
58     for(int i=0; i<n; i++)
59     {
60         cin>>a[i];
61     }
62     //初始化结束
63     while(*p1!=0)
64     {
65         if(*p2==0&&gettop(mystack)!=*p1)
66         {
67             flag=false;
68             break;
69         }
70         else
71         {
72             if(*p1==*p2)
73             {
74                 p1++;
75                 p2++;
76             }
77             else if(*p1==gettop(mystack))
78             {
79                 pop(mystack);
80                 p1++;
81             }
82             else
83             {
84                 push(mystack,*p2);
85                 p2++;
86             }
87         }
88     }
89     if(flag)
90     {
91         cout<<"I can do it.";
92     }
93     else
94     {
95         cout<<"That is impossible.";
96     }
97     free(mystack);
98 }

end here

猜你喜欢

转载自www.cnblogs.com/wanjinliu/p/11420051.html