永发信息网

c语言实现队列和栈的方法

答案:1  悬赏:20  手机版
解决时间 2021-07-17 13:51

在许多语言现象中,常见到一种形如abcba的文字,这种文字从左到右读和从右到左读结果是一样的,这种文字就是常说的回文。设计一个程序可以判断给定的一个文字是否是回文。

注意:要求在实现上面的题目时,必须使用如下算法:

考虑到栈的先进后出以及队列的后进先出,可以结合这两种结构来实现需要的功能,即将文字分别入队和入栈,然后依次通过出队和出栈输出判断是否有不相同的字符,一旦发现就证明文字不是一个回文。

实验步骤:

第一步:编写程序,实现栈,该栈可以用数组实现,也可以用链表实现

第二步:编写程序,实现队列,该队列可以为循环队列,也可以用链表实现

第三步:编写主算法,使用自己编写的栈和队列实现回文判断问题(通过键盘输入一个以#结束的字符串,进行判断)

最佳答案

#define OVERFLOW -1
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define N 20
typedef char SElemType;
typedef int Status;


typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;


#include<stdio.h>
#include<stdlib.h>


Status CreatStack(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;
}//CreatStack


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){
//若栈不空,删除栈顶元素,并用e返回其值
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}//Pop



typedef char QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QNodePtr;


typedef struct{
QNodePtr front;
QNodePtr rear;
}LinkQueue;


Status CreatQueue(LinkQueue &Q){
//建立一个空的链式栈
Q.front=Q.rear=(QNodePtr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}


Status EnQueue(LinkQueue &Q,QElemType e){ QNodePtr p;
p=(QNodePtr)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}


Status DeQueue(LinkQueue &Q,QElemType &e){QNodePtr p;
if(Q.front==Q.rear) return ERROR;
p=Q.front->next; e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return OK;
}


int stackPalindrom_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0
{
printf("栈练习,请输入要判断的字符串以#作为结束符,不要超过二十个字符\n");
SqStack S;
CreatStack(S);
char c;
SElemType a;
SElemType b[N];
int count = 0;
fgets( b, N, stdin );
while((b[count])!='#')
{
Push(S,b[count]); //进栈
count++;
}
int i = 0;
while(i < count)
{
Pop(S,a);
if(a!=b[i])
return ERROR;
i++;
}
return OK;


}//stackPalindrom_Test


int queuePalindrom_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0
{
printf("队列练习,请输入要判断的字符串以#作为结束符,不要超过二十个字符\n");
LinkQueue Q;
CreatQueue(Q);


char c;
SElemType a;
SElemType b[N];
int count = 0;
fgets( b, N, stdin );
while((b[count])!='#')
{
EnQueue(Q,b[count]);; //入列
count++;
}


while(count-- > 0)
{
DeQueue(Q,a);
if(a!=b[count])
return ERROR;
}
return OK;
}//queuePalindrom_Test


Status main(){


if(stackPalindrom_Test()==1)
printf("是回文\n");
else printf("不是回文\n");


if(queuePalindrom_Test()==1)
printf("是回文\n");
else printf("不是回文\n");
return OK;
}

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
网恋的来回答…
QQ自由玄想杂亮点啊
怎样点亮“QQ邮箱”的图标
c诚实跟八面玲珑相斥么
跪求 《妹妹背着洋娃娃 诡异版》能放在空间的
为什么会困?
他这样做对吗
换号码卡超级QQ需要重新绑定吗
汕头市市区哪里有招五金模具师傅
笔记本一联网就死机是怎么回事?
丝路英雄为什么制造的金币会没
《富贵门》的英文插曲叫什么名字?
我这东西可以卖多少
极品飞车9有个叫qwe的存档我想找到!谢谢!
先化简,再求值:(2x+1)的平方*(3x-2)-(2x+1)
推荐资讯
dnf+12万仞有人要吗
地下城黑一素喃到底多少游戏币啊?
如何才能去除黑色素
冻梨为什么要用凉水化专业答案
为什么我不能忘掉她?三年了,我一直努力想忘
一键还原精灵怎样将电脑整体还原?
福建省晋江市池店镇哪里有充值手机话费的地方
诛仙里练135法宝什么的75神品好
装备被盗为什么只有+16武器 没有找回来
女朋友生日送什么礼物好?(她十七岁了)
阿根庭都有什么节日,在几月几号?
找人帮忙设计诛仙2名字 若雪无艳 要快!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?