C言語はスタックのシーケンスを実現します。


本論文の例では、C言語のスタックシーケンスを実現するための具体的なコードを共有します。
テーマの説明:
1−nの配列がありますが、スタックのシーケンスはすでに知られています。辞書のシーケンスの最大のスタックのシーケンスを与えてください。
入力フォーマット
最初の行は整数nです。1<=n<=100)
第二行n個の整数は、データが1−nの配列であることを保証する。
出力フォーマット
n個の整数が出力され、最大のスタックシーケンスが辞書順である。
入力サンプル
5
1 2 4 5 3
出力サンプル
5 4 3 2 1
問題解決の考え方:
1、現在の配列の最大値を取得し、その下付きを知る必要があります。したがって、2つの方法を定義し、getMaxは配列の最大値maxNumを取得し、getMaxIndexは最大値の下付きmax_を取得する。index
2、最大値とその前の数字をスタックに押し込む
3、このとき最大値をスタックから飛び出す(いらないかもしれません。いらないなら、コードの冗長性を減らすことができます。
4、呼び出し方法getMax、getMaxIndexはmaxNum後の顔配列の最大値r_を取得する。max、および下付き。
5、後ろの配列の最大値r_maxと現在のスタックトップ要素を比較すると、スタックトップ要素がr_以上である場合maxは、スタックトップ要素tmpをスタックから飛び出すと同時に、このスタックトップ要素tmpを出力します。さもないと、r_maxが現在のスタックトップ要素より大きいとr_max前の数字をスタックに押し込み、r_を取得する必要があります。maxの後の配列の最大値と下付き文字です。
注意このステップは、後面子配列の最大値r_である必要があります。maxとスタックトップ要素を比較した。後面子配列の最大値r_ではなくmaxとmaxNumの前の数字の最大値を比較すると、得られたのは正しい出庫シーケンスではない。
6、上記の操作を繰り返して、入力された配列がすでに巡回されてしまい、プログラムが終了します。
対応コード:

#include<stdio.h>
#define ERROR 0
#define OK 1
#define MAX_SIZE 100
#define N 100
typedef struct NODE{
    int arr[MAX_SIZE];
    int top;
}Node;
void init(Node &s){
   s.top = 0;
}
//  
int pushElem(Node &s,int c){
   if(s.top == MAX_SIZE){
     return ERROR;//     ,    ERROR
   }
   s.arr[s.top++] = c;
   return OK;
}
//      
int popElem(Node &s,int &c){
   if(s.top == 0){
    /*
         ,    ERROR
          s.top == 0   ,           
       s.top     ,   s.top = 1   ,    1  ,  
       s.top   0,               ,           
    s.top 0,             
    */
     return ERROR;
   }
   c = s.arr[--s.top];//         c
   return OK;
}
//      
int getTop(Node &s,int &c){
    if(s.top == 0){
    /*
         ,    ERROR
          s.top == 0   ,           
       s.top     ,   s.top = 1   ,    1  ,  
       s.top   0,               ,           
    s.top 0,             
    */
     return ERROR;
   }
   c = s.arr[s.top - 1];//        c
   return OK;
}
int isEmpty(Node &s){
    return s.top == 0;
}
/*
 maxNum           ,    maxNum   
*/
int getMax_index(int *arr,Node &s,int left,int right,int maxNum){
  int i;
  for(i = left; i < right; i++){
    pushElem(s,arr[i]);//          
    if(arr[i] == maxNum){
        //          ,          
        break;
    }
  }
  return i;
}
/*
  left - right      
*/
int arrayMax(int *arr,int left,int right){
  int i,maxNum = 0;
  for(i = left; i < right; i++){
    if(maxNum == 0 || arr[i] > maxNum)
        maxNum = arr[i];
  }
  return maxNum;
}
//         
void getMax(int *arr,Node &s,int  left,int right,int maxNum){
  if(left >= right){
  //             ,      
     return;
  }
  //tmp      ,r_max  maxNum         ,i  maxNum   
  int i,tmp,r_max;
  /*
   maxNum           ,   maxNum     
  */
  i = getMax_index(arr,s,left,right,maxNum);
  r_max = arrayMax(arr,i + 1,right);//  maxNum         
  /*
           ,           r_max    ,  
  maxNum    ,      manNum 
  popElem(s,tmp);//    maxNum   tmp,      
  printf("%d ",tmp);
  */
  while(!isEmpty(s)){
        getTop(s,tmp);//      
        if(r_max > tmp){
           //  r_max        ,   ,             ,    r_max   
            i = getMax_index(arr,s,i + 1,right,r_max);
            r_max = arrayMax(arr,i + 1,right);//   i + 1  right      
           // printf("
:%d
",i); }else{ // r_max , , popElem(s,tmp); printf("%d ",tmp); } } getMax(arr,s,i + 1,right,r_max); } int main(){ int arr[N]; int n,i,maxNum; Node s; init(s);// printf(" :"); scanf("%d",&n);// for(i = 0; i < n; i++) scanf("%d",&arr[i]); maxNum = arrayMax(arr,0,n);// left-right getMax(arr,s,0,n,maxNum); return 0; }
実行結果:

以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。