数据算法与结构-实现循环队列的基本操作 回文判断

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

#define OK 1
#define OVERFLOW -1
#define ERROR 0;
typedef int Status;

typedef char SElemType;



// 顺序栈类型定义:
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(OVERFLOW);//存储分配失败
S.top=S.base;//空栈
S.stacksize=STACK_INIT_SIZE;
return OK;
} //InitStack


Status StackEmpty(SqStack S)
{
if(S.top==S.base) return OK;

return ERROR;

} //StackEmpty

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+=STACKINCREMENT;
}

*S.top++=e;

return OK;
} //Push

Status Pop(SqStack &S,SElemType &e)
{
// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S.top==S.base) return ERROR;

e=*--S.top;


return OK;
} //Pop

//打印栈
Status Print(SqStack S)
{
SElemType *p;
p=S.top;
int i=0;
printf("\n-------------------------------\n栈的内容是:\n 栈顶\n");
while(p!=S.base) {p--;i++;}
p=S.top;
while(p!=S.base)
{
printf("第%d元素:%c\n",i,*(p-1));
p--;
i--;
}
printf("-------------------------------\n");
return OK;
}





typedef char QElemType;

#define MAXQSIZE 100
typedef struct {
QElemType *base;
int front;
int rear;
}SqQueue;

// --循环队列的基本操作的算法描述---

//构造一个空队列
Status InitQueue(SqQueue &Q)
{
Q.base=(QElemType *)malloc(MAXQSIZE *sizeof(QElemType));
if(!Q.base) exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}


// 插入元素e为新的队尾元素
Status EnQueue(SqQueue &Q,QElemType e)
{

if((Q.rear+1) % MAXQSIZE==Q.front) return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1) %MAXQSIZE;
return OK;
}

// 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
Status DeQueue(SqQueue &Q,QElemType &e)
{

if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1) % MAXQSIZE;
return OK;
}

// 返回Q的元素个数,即队列的长度
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXQSIZE) % MAXQSIZE;
}


//打印
Status QueuePrint(SqQueue Q)
{
QElemType e;
printf("----------------\n队列的内容是: \n");
while(Q.front!=Q.rear)
{
e=Q.base[Q.front];
Q.front=(Q.front+1) % MAXQSIZE;
printf(" %c\n",e);
}
return OK;
}


int main()
{
SqQ

ueue Q;
SqStack S;
printf("请输入一段字符序列,以'@'为结束符");
char e;
InitQueue(Q);//队列构建
InitStack(S);//栈的构建

scanf("%c",&e);
while(e!='@')
{
Push(S,e);
EnQueue(Q,e) ;
scanf("%c",&e);
}
QueuePrint(Q);
Print(S);
int n;
n=QueueLength(Q);//n为输入字符个数
printf("n=%d\n\n",n);
char a,b;
int i;
for(i=0;i{
DeQueue(Q,a);
Pop(S,b);
printf("i=%d,a=%c,b=%c\n",i,a,b);
if(a!=b)
break;
}
if(i>=n)
printf("是回文\n");
else
printf("不是回文\n");
return 0;
}

相关文档
最新文档