此函数为检查输入的字符序列是否是回文。我写的有点小错误。请帮忙改正。谢谢您
//下面的程序为解决判断以@为结束符的字符序列是否为回文。//算法思路:分别创建一个栈,和一个队列。为其同时输入元素。
//充分利用其特点,栈后进先出。队列先进先出的特性。
//比较栈弹出的元素与出队元素是否相等。若相等,那么继续比较
//剩余的元素,直到栈空为止。若元素不相同,那么打印“不是回文“
//返回ERROR。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;
typedef char QElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
//栈的存储结构定义
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S){
//初始化一个空栈
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) exit(ERROR);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
Status GetTop(SqStack &S,SElemType &e){
//若栈不空,返回栈顶的元素,并返回OK;否则返回ERROR;
if(S.top==S.base) return ERROR;//注意等号”==“
e=*(S.top-1);//注意栈顶指针永远指向栈顶元素的下一个位置
return OK;
}
Status Push(SqStack & S,SElemType e){
//插入新的元素e使其成为新的栈顶元素
//若栈满,则重新开辟空间,开辟空间后要判断是否成功
if(S.top-S.base>=S.stacksize){
//栈满了,追加空间
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
//这时不要忘记新栈的栈顶指针,即栈容量的改变
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}//if
*S.top=e;
S.top++;
return OK;
}//Push
Status Pop(SqStack &S,SElemType &e){
//若栈不空,则删除栈顶元素,并用e带回,返回OK。否则
//返回ERROR.
if(S.top==S.base)return ERROR;
e=*(--S.top);
return OK;
}// Pop
typedef struct QNode{
//链队列的结点类型定义
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
//链队列的存储结构定义。
//一个链队列由分别指向队头和队尾的指针惟一确定
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
Status InitQueue(LinkQueue &Q){
//构造一个空的队列
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));//开辟空间
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}//InitQueue
Status EnQueue(LinkQueue &Q,QElemType e){
//插入元素e使其成为新的队尾元素
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
p->data=e;
p->next=NULL;
//以上为新建结点的过程,下面为链接的过程
Q.rear->next=p;
//此时新队列的队尾指针应该为新插入的元素
Q.rear=p;
return OK;
}//EnQueue
Status DeQueue(LinkQueue &Q,QElemType &e){
//删除队列的队头元素,删除前应先判断队列是否为空。若空返回ERRORR
//若删除后队列为空那么,应重新给Q.rear赋值为对头指针
if(Q.front==Q.rear)return ERROR;
QueuePtr p;
p=Q.front->next;//p指向首元素
e=p->data;
Q.front->next=p->next;//Q.front现在指向了第二号元素
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return OK;
}//DeQueue
Status CheckPalindrome(){
//检验输入的字符串是否是回文,若是返回OK,否则返回ERROR
//思路:同时使用栈,和队列两种存储结构。同时获取从键盘上输入字符
//以@未结束符。输入完成后,只要栈不空,那么一次弹出栈顶元素与队列的头元素
//比较。若相等返回OK;否则返回ERROR;
SqStack S;LinkQueue Q;
InitQueue(Q);
InitStack(S);
//以上未初始化栈和队列
SElemType c;
printf("请输入您将要检验的字符序列,以@结束:\n");
while((c=putchar(c))!='@'){
Push(S,c);EnQueue(Q,c);
}//完成输入
while(S.top!=S.base){
//栈不空
SElemType a;QElemType b;
Pop(S,a);DeQueue(Q,b);
if(a!=b){
printf("输入的字符序列不是回文\n");
return ERROR;
}//if
else{
printf("输入的字符序列是回文\n");
return OK;
}//else
}//while
return OK;
}//CheckPalindrome
int main(){
printf("即将检验CheckPalindrome()的正确性,请做好准备!\n");
CheckPalindrome();
return 1;
}
//红色标注部分为我认为有错的地方,请帮忙改正,并简单讲解一下,如何能够做到
1、从键盘输入字符,若不是@那么就压入栈,EnQueue
谢谢了,在线等!谢谢!希望交流……
我是新手没钱打赏大家见谅吧!
真诚希望交流学习问题。我是ST默文.