问题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,另一种是将数组的中间位置设为起始位置,前面的栈是从数组中间位置开始插入元素,从中间往前插入元素,后面的栈是从数组的中间位置(在前一个数组起始位置往后一个位置)开始往后插入元素。第一种方法能够将空间充分的利用,空间利用率更高,详细如图所示
在往栈中插入元素,就是在往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 }