データ構造の実験メモ(二):スタックは判定文字列を実現する.
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 **********/
}
考え方:私のエラー: 以下の操作を行う場合`.
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]です.