1、 free(p); return d;int main(void) data inputMAX; stack temp; int i = 0; int flag = 0; initialize(&temp); /初始化临时栈 scanf(%s, &input); /输入字符串 while (inputi != ) /字符串入栈 push(inputi, & i+; while (!empty(&temp) /字符依次出栈和字符数组比较,判断是否回文数 if (temp.top-d = inputflag) pop(& flag+; else printf(此字符序列不是回文数!n); brea
2、k; if (empty(&temp) printf(此字符序列是回文数! return 1;判断用户输入的字符串是否为回文/*题目*/判断用户输入的字符串是否为回文/回文是指顺读和反读都一样的串/例:abccba为回文,abcdab不是回文/*/数据结构:循环队列和顺序栈/算法思想:/1.将字符串按照用户输入的顺序分别入栈和队列/2.分别从队列和栈中取出首个字符/3.比较取出的字符,若相等,继续分别从队列和栈中取首个字符;否则跳出循环,并设置标志flag=0;/4.若队列和栈中的字符取完,则结束,设置标志flag=1;/5.flag=1,表示字符从前往后和从后往前的序列完全匹配,该字符串属于
3、回文/6.flag=0,表示字符从前往后和从后往前的序列不完全匹配,该字符串不属于回文/programer:cooler#include #include#define m 100typedef structchar stackm;int top;stackstru; / 定义栈typedef struct char queuem;int front;int rear;queuestru; /定义队列void main()/函数声明int stinit(stackstru *s); /初始化顺序栈int stempty(stackstru *s); /判断栈是否为空int stpush(sta
4、ckstru *s,char x); /入栈char stpop(stackstru *s); /出栈int quinit(queuestru *q); /初始化循环队列int quempty(queuestru *q); /判断队列是否为空int enqueue(queuestru *q,char e); /入队char dequeue(queuestru *q); /出队/char c;int flag=0;stackstru *s=(stackstru *)malloc(sizeof(stackstru); /为顺序栈申请空间queuestru *q=(queuestru *)mallo
5、c(sizeof(queuestru); /为队列申请空间stinit(s); /初始化栈quinit(q); /初始化队列printf(Input a string:/输入字符串,输入标示输入结束。while(c=getchar()!=) /将输入的字符串入栈和队列putchar(c); /输出输入的字符stpush(s,c); /字符进栈enqueue(q,c); /字符进队列End input! /提示信息while(stempty(s) /栈中还有元素if(stpop(s)=dequeue(q) /出栈的字符与出队列的字符匹配flag=1; /将标志设置为1continue; /继续从
6、栈和队列中区字符else /字符不匹配flag=0;break; /跳出循环,将标志设置为0if(flag=1)This string is palindrome! /标志位为1,完全匹配,是回文elseThis string isnt palindrome!/标志位为0,不完全匹配,不是回文int stinit(stackstru *s)s-top=0;return 1; /初始化栈int stempty(stackstru *s)if(s-top=0) /栈顶为空return 0; /判断栈是否空int stpush(stackstru *s,char x)top=m) /栈满The st
7、ack is overflow! /输出提示信息else /栈未满top=s-top+1; /栈顶后移stacks-top=x; /字符入栈 /入栈操作char stpop(stackstru *s)char y;top=0) /栈为空The stack is empty!return ; /返回空格else /栈不为空y=s-top; /取出栈顶元素top-1; /栈顶指示移动return y; /出栈操作int quinit(queuestru *q)q-front=0;rear=0; /初始化为一个空的循环队列int quempty(queuestru *q)if(q-front=q-r
8、ear) /队头和队尾相等 /判断队列是否为空int enqueue(queuestru *q,char e)if(q-rear+1)%m=q-front) /队列已满The queue is overflow!queueq-rear=e;rear=(q-rear+1)%m; /移动队尾指针 /入队操作char dequeue(queuestru *q)char f;rear) /队列为空The queue is empty!f=q-front; /取出队首元素front=(q-front+1)%m; /移动对头指针return f; /出队操作 typedef struct node cha
9、r data; struct node *next;node; node *top; unsigned int size; stack;typedef struct node *front; node *back; queue;char pops(stack *a) node *tf=NULL; char rt=0; if (a-size) tf=a- a-top=a- -a-size; rt=tf-data; free(tf); return rt;char popq(queue *a)front;front=a-front-void push(stack *a,const char c)
10、node *t=(node*)malloc(sizeof(node); if (t) t-data=c;next=a-top=t; +a-void push_back(queue *a,const char c)next=NULL;a-back=t; else back-next=t;int isempty(void *a,int tp) if (tp=1) return !(stack *)a)-size); else return !(queue *)a)-void initqs(void *a,int tp) if (tp=1) (stack*)a)-top=NULL;size=0; e
11、lse (queue*)a)-front=(queue*)a)-back=NULL;void del(void *a,int tp) node *t; while (stack*)a)-top) t= (stack*)a)-top=(stack*)a)- free(t); free(a); else while (queue*)a)-front) t= (queue*)a)-int chk(void) char ch; int fg=1,rt=0; stack *a=(stack*)malloc(sizeof(stack); queue *b=(queue*)malloc(sizeof(que
12、ue);a|!b) fprintf(stderr,MEMORY ERROR exit(-1); initqs(a,1); initqs(b,0); puts(Enter a string ,end with while (ch=getchar()!) push(a,ch); push_back(b,ch); while (!isempty(a,1)&!isempty(b,0) if (pops(a)!=popq(b) fg=0; if (fg&isempty(b,0) rt= 1; del(a,1); del(b,0);int main(void) if (chk() puts(YES els
13、e puts(NO return 0;/- 用栈实现了判断回文数的操作,即把字符串依次入栈,然后出栈并依次和字符数组比较是否相等,从而判断字符序列是否回文数,代码如下:#define EMPTY 0#define FULL 10000#define MAX 10000typedef char data;typedef struct elem data d;typedef struct stack int cnt; /栈操作函数void initialize(stack *stk)bool empty(const stack *stk) return stk-bool full(const st
14、ack *stk)void push(data d, stack *stk)full(stk) p = (elem *)malloc(sizeof(elem);data pop(stack *stk)empty(stk) d = stk- return d; data inputMAX; /初始化临时栈 scanf( /输入字符串 while (inputi ! /字符串入栈 push(inputi, &temp) /字符依次出栈和字符数组比较,判断是否回文数 if (temp.top-d = inputflag) pop(& printf( if (empty(&本文来自CSDN博客,转载请
15、标明出处:我自己写了一个,你看看/*用栈和队列进行回文判断输入字符以结束*/*定义一个栈*/typedef struct Stackint size;char * Base;char * Top;Stack;/*创建一个栈*/void CreateStack(Stack * S,int size)S - size = size; Base = (char *)malloc(size); Top = S - Base;/*推入一个元素*/void Push(Stack * S,char c)/*栈满了,不能插入了*/if(S - Top - S - Base = S - size)Stack i
16、s full and cant push!return;*(+S - Top) = c;void Pop(Stack * S)/*栈空了*/ Top = S - Base)Stack is empty! Top-;Stack S;int Begin;CreateStack(&S,100);Begin = 0;while(1)scanf(%c,&c);if(c = & !Begin)Begin = 1;if(Begin)if(*(S.Top) = c)Pop(&S);Push(&S,c);if(S.Top = S.Base)oknfailngetch();用数据结构的栈和队列 写 回文判断_参考答案:/- node *tf=null;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1