データ構造用スタックとキュー判定回文数

4845 ワード

12321、あなたはあなたではありませんか?このようなものは回文といいます.行列とスタックの保存方法が違いますので、スタックはLIFO、last in first out、皿は一つずつ積み重ねて、上から取ります.キューはFIFO、firstです.  n first outは現実の行列のようです.この二つの構造に数字を入れて、一つずつ取り出します.同じなら、回文数です.
          Stock AndQueqe.h
#include<stdio.h>
typedef char DataType;
typedef struct Node *PNode;
struct Node{
	DataType info;
	PNode link;
};
typedef struct LinkQueqe *PQueqe;
struct LinkQueqe{
	PNode f;
	PNode b;
};
typedef struct LinkStack *PStack;
struct LinkStack{
	PNode top;
};

PStack createStack();
int isEmptyStack(PStack pstack);
void pushStack(PStack pstack,DataType element);
DataType popStack(PStack pstack);
DataType topStack(PStack pstack); 
void printStack(PStack pstack);
PQueqe createQueqe();
int isEmptyQueqe(PQueqe pqueqe);
void pushQueqe(PQueqe pqueqe,DataType element);
DataType popQueqe(PQueqe pqueqe);
DataType topQueqe(PQueqe pqueqe); 
void printQueqe(PQueqe pqueqe);
Stock AndQue.c
#include "StackAndQueqe.h"
PQueqe createQueqe(){
	PQueqe pqueqe = (PQueqe)malloc(sizeof(struct LinkQueqe));
	if(pqueqe == NULL) printf("create fail");
	pqueqe ->f = NULL;
	pqueqe ->b = NULL;
	return pqueqe;
}

int isEmptyQueqe(PQueqe pqueqe){
	return (pqueqe ->f == NULL);
}

void pushQueqe(PQueqe pqueqe,DataType element){
	PNode p = (PNode)malloc(sizeof(struct Node));
	if(p == NULL) printf("nothing push");
	p ->info = element;
	p ->link = NULL;
	if(pqueqe ->f == NULL){
		 pqueqe->f = p;
	//printf(" f  %5d
",pqueqe->f->info); } else pqueqe ->b ->link = p; pqueqe ->b = p; // printf("b %d
",pqueqe->b->info); } DataType popQueqe(PQueqe pqueqe){ PNode p; DataType temp; if(isEmptyQueqe(pqueqe)) printf("queqe is empty"); p = pqueqe ->f; temp = p->info; pqueqe ->f = p->link; free(p); return temp; } DataType topQueqe(PQueqe pqueqe){ if(pqueqe->f == NULL){ printf("nothing top"); return NULL; } return pqueqe -> f->info ; } void printQueqe(PQueqe pqueqe){ PNode p = pqueqe ->f; if( isEmptyQueqe(pqueqe)){ printf("nothing print"); } while(pqueqe->f!= NULL){ printf("%3c",pqueqe->f->info); pqueqe ->f = pqueqe ->f ->link; } pqueqe ->f = p;// f link ! } PStack createStack(){ PStack pstack = (PStack)malloc(sizeof(struct LinkStack)); if(pstack == NULL) printf("create fail"); pstack ->top = NULL; return pstack; } int isEmptyStack(PStack pstack){ return(pstack->top == NULL); } void pushStack(PStack pstack,DataType element){ PNode p = (PNode)malloc(sizeof(struct Node)); if(p == NULL) printf("push fail"); p ->info = element; p ->link = pstack ->top; pstack ->top = p; } DataType popStack(PStack pstack){ PNode p; DataType temp; if(pstack ->top == NULL) printf("nothing pop"); p = pstack ->top; temp = p->info; pstack ->top = pstack->top->link; free(p); return temp; } DataType topStack(PStack pstack){ if(pstack ->top == NULL){ printf("nothing pop"); return NULL; } return pstack->top->info; } void printStack(PStack pstack){ PNode p= pstack ->top; if(pstack ->top == NULL){ printf("nothing pop"); } while(pstack->top != NULL){ printf("%3c",pstack ->top ->info); pstack ->top = pstack ->top ->link; } pstack ->top = p; }
#include "StackAndQueqe.h"

int main(){
	int i;
 	char s[100];
    int n=0;
    PQueqe pqueqe ; 
    PStack pstack;
	printf("please input string to judge whether it is a palindrome(   ):
"); scanf("%c",&s[0]); while(s[n]!='
') { scanf("%c",&s[++n]); } printf(" the length is %d:
",n); printf(" the string is : "); for(i=0;i<n;i++){ printf("%c",s[i]); } pqueqe = createQueqe(); for(i=0;i<n;i++){ //printf("
%c",s[i]); pushQueqe(pqueqe,s[i]); } pstack = createStack(); for(i=0;i<n;i++){ pushStack(pstack,s[i]); } printf("
the queqe is : "); printQueqe(pqueqe); printf("
the stack is : "); printStack(pstack); printf("
"); for(i=0;i<n/2;i++){ if(popQueqe(pqueqe)!= popStack(pstack)){ printf("is not HUIWEN!
"); break; } else { printf("it is HUIWEN!
"); break; } } return 0; }
     
       簡単には取り出した数だけ半分に切ってください.