问题4:元素出栈、入栈顺序的合法性
问题5:共享栈(一个数组实现两个栈)
问题4:元素出栈、入栈顺序的合法性
问题分析:
首先先创建一个栈,有两个数组,分别为input和output,分别表示入栈的元素,和要出栈的元素,先将input的元素循环入栈,然后取栈顶元素与output_index做比较,若栈顶元素不等于output_index,则循环结束,让下一个input元素入栈,若output_index等于栈顶元素,则要移进output_index,并将栈顶元素移出栈,循环比较栈顶元素与output_index指向的值,若最终栈为空,output_index指向output中最后一个元素的下一个元素,返回“1”,表示合法,否则,返回“0”,表示非法,详细见程序
4 int StackOrder(char input[],size_t input_size,char output[],size_t output_size)
5 {
6 //循环把Input元素入栈
7 SeqStact stack;
8 SeqStactInit(&stack);
9 size_t output_index=0;
10 size_t i=0;
11 for(;i<input_size;++i)
12 {
13 SeqStactPush(&stack,input[i]);
14 char top;
15 int ret=SeqStactTop(&stack,&top);
16 if(ret == 0)
17 {
18 break;
19 }
20 //取栈顶元素与output_index做比较
21 while(1)
22 {
23 //若栈顶元素!=output_index,则结束循环,让下一个input元素入栈
24 //若栈顶元素=output_index
25 //(1)移进output_index
26 //(2)把栈顶元素移出栈
27 //(3)循环到比较栈顶元素与output_index指向的值
28 if(output_index>=output_size)
29 {
30 //output遍历完了
31 break;
32 }
33 if(top!=output[output_index])
34 {
35 break;
36 }
37 ++output_index;
38 SeqStactPop(&stack);
39 }
40 }
41 //若最终栈为空,output_index指向output中最后一个元素的next元素,则返回能够为“1”
42 //否则为不能,返回“0”
43 if(stack.size==0&&output_index==output_size)
44 {
45 return 1;
46 }
47 return 0;
48 }
49
问题5:共享栈(一个数组实现两个栈)
用一个数组来实现两个栈,有两种方法,一种是将一个数组的头和为分别看作两个栈的栈顶,分别为top1和top2,另一种是将数组的中间位置设为起始位置,前面的栈是从数组中间位置开始插入元素,从中间往前插入元素,后面的栈是从数组的中间位置(在前一个数组起始位置往后一个位置)开始往后插入元素。第一种方法能够将空间充分的利用,空间利用率更高,详细如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/0f46785fac4e98c4975693c7d275f928.png)
在往栈中插入元素,就是在往top1的后面插入元素,往top2的前面插入元素
删除元素就是将top1前移,将top2后移
具体过程见程序
初始化操作
typedef char ShareStackType;
4 typedef struct ShareStack
5 {
6 ShareStackType data[ShareStackMaxSize];
7 size_t top1;
8 size_t top2;
9 }ShareStack;
10
11 //初始化
12 void ShareStackInit(ShareStack* stack)
13 {
14 if(stack == NULL)
15 {
16 //非法操作
17 return ;
18 }
19 stack->top1=0;
20 stack->top2=ShareStackMaxSize;
21 }
入栈操作
23 //插入元素
24 void ShareStackPush1(ShareStack* stack,ShareStackType value)
25 {
26 if(stack == NULL)
27 {
28 //非法操作
29 return;
30 }
31 if(stack->top1>=stack->top2)
32 {
33 //棧满
34 return;
35 }
36 stack->data[stack->top1++]=value;
37 return;
38 }
39 void ShareStackPush2(ShareStack* stack,ShareStackType value)
40 {
41 if(stack == NULL)
42 {
43 //非法操作
44 return;
45 }
46 if(stack->top1>=stack->top2)
47 {
48 //棧满
49 return;
50 }
51 stack->data[--stack->top2]=value;
52 return;
53 }
54
取栈顶元素
55 //取棧顶元素
56 int ShareStackTop1(ShareStack* stack,ShareStackType* value)
57 {
58 if(stack == NULL || value == NULL)
59 {
60 //非法操作
61 return 0;
62 }
63 if(stack->top1 == 0)
64 {
65 //棧为空
66 return 0;
67 }
68 *value=stack->data[stack->top1-1];
69 return 1;
70 }
71 int ShareStackTop2(ShareStack* stack,ShareStackType* value)
72 {
73 if(stack == NULL || value == NULL)
74 {
75 //非法操作
76 return 0;
77 }
78 if(stack->top2 == ShareStackMaxSize)
79 {
80 //棧为空
81 return 0;
82 }
83 *value=stack->data[stack->top2];
84 return 1;
85 }
出栈操作
87 //删除元素
88 void ShareStackPop1(ShareStack* stack)
89 {
90 if(stack == NULL)
91 {
92 return;
93 }
94 if(stack->top1 == 0)
95 {
96 return;
97 }
98 --stack->top1;
99 return;
100 }
101 void ShareStackPop2(ShareStack* stack)
102 {
103 if(stack == NULL)
104 {
105 return;
106 }
107 if(stack->top2=ShareStackMaxSize)
108 {
109 return;
110 }
111 ++stack->top2;
112 return;
113 }