データ構造の実験メモ(二):スタックは判定文字列を実現する.

14163 ワード

typedef int T; //          
struct Stack{
	T* data;  //              	  
	int top;   //           
	int max;  //                  
};

bool Stack_IsEmpty(Stack* stk)
//       
{
    return -1 == stk->top;
}
Stack* Stack_Create(int maxlen)
//    
{
    Stack* stk = (Stack*)malloc(sizeof(Stack));
    stk->data = (T*)malloc(sizeof(T)*maxlen);
    stk->max = maxlen;
    stk->top = -1;
    return stk;
}
T Stack_Push(Stack* stk, T e)
//    e    
//        
{
    if(Stack_IsFull(stk)) {
        printf("Stack_IsFull(): stack full error when push element to the stack!
"
); Stack_Free(stk); exit(0); } else{ stk->top += 1; stk->data[stk->top] = e; return Stack_Top(stk); } } T Stack_Pop(Stack* stk) // // { if(Stack_IsEmpty(stk)) { printf("Stack_IsEmpty(): stack empty error when pop element of the stack top!
"
); Stack_Free(stk); exit(0); } else{ T topE = Stack_Top(stk); stk->top -= 1; return topE; } } void Palindrome(T* str, int len) // stack // : , // YES, NO, { // , /********** Begin *********/ Stack *stk = Stack_Create(100);// int i; for(i=0;i<len/2;i++) Stack_Push(stk, str[i]);// len/2 int state = 1; // if(len%2==1) //len i++; for(;i<len&&state;i++) if(!Stack_IsEmpty(stk)&&Stack_Top(stk) == str[i])// str[i]?? Stack_Pop(stk);// else// , state=0; if(Stack_IsEmpty(stk)&&state)// 1 printf("YES"); else printf("NO"); printf("
"
); /********** End **********/ }
考え方:
  • は、前len/2文字をスタックに入れる
  • .
  • 設定フラグ
  • は、スタックトップ要素とstr中の対称位置要素を比較する.  - 同じ場合、スタックトップの要素は、次の比較を行います.  - 異なる場合は、フラグを0に設定し、ループを終了する
  • .
    私のエラー:   以下の操作を行う場合`.
    for(;i<len&&state;i++)
            if(!Stack_IsEmpty(stk)&&Stack_Top(stk) == str[i])//         str[i]??  
                Stack_Pop(stk);//        
            else//     ,    
                state=0;
    
    スタック操作後、i=len/2-1と誤解されていますが、実際には、スタック出サイクルの条件はi=len/2ですので、スタックトップ要素と比較するのはstr[i]です.