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、上記の操作を繰り返して、入力された配列がすでに巡回されてしまい、プログラムが終了します。
対応コード:
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
テーマの説明:
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;
}
実行結果:以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。