栈和队列的一些笔试题(2)

问题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 }                                                                                  

猜你喜欢

转载自blog.csdn.net/l_x_y_hh/article/details/79889291