データ構造用スタックとキュー判定回文数
4845 ワード
12321、あなたはあなたではありませんか?このようなものは回文といいます.行列とスタックの保存方法が違いますので、スタックはLIFO、last in first out、皿は一つずつ積み重ねて、上から取ります.キューはFIFO、firstです. n first outは現実の行列のようです.この二つの構造に数字を入れて、一つずつ取り出します.同じなら、回文数です.
Stock AndQueqe.h
簡単には取り出した数だけ半分に切ってください.
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;
}
簡単には取り出した数だけ半分に切ってください.