判断字符串是否为回文----使用栈和队列

前言

回文自然都懂,不多说
本文基于:
队列—先进先出
栈 —后入先出
这一结构来实现判断

算法分析

将字符串分别存储到栈和队列中之后分别输出判断是否相等

代码实现

#include<stdio.h>
#include<string.h>

#include"Seqstack.h"
#include"Seqqueue.h"
//相应的实现栈和队列的头文件


int huiwen_fun(char str[])
{
	int n=strlen(str);
	PSeqStack S;
	PSeqQueue Q;
	S=Init_SeqStack();
	Q=Init_SeqQueue();
	if(!S)
	{
		printf("栈初始化错误!");
		return 0;
	}//创建栈
	if(!Q)
	{
		printf("队列初始化错误!");
		return 0;
	}//创建队列
	int i;
	for(i=0;i<n;i++)    //入栈(队列)
	{
		In_SeqQueue(Q,str[i]);
		Push_SeqStack(S,str[i]);
	}
	DataType q,s;
	for(i=0;i<n;i++)//出栈(队列)
	{
		Pop_SeqStack(S,&s);
		Out_SeqQueue(Q,&q);   
		if(s!=q)  //判断是否相等
		{	printf("%s不是回文",str);
			return 0;
		}
	}
	printf("%s是回文",str);	
	Destroy_SeqQueue(&Q);
	Destroy_Seqstack(&S); 
	return 0;
}

//主函数

int main()
{
	char str[100];
	printf("输入字符串:");
	scanf("%s",str);
	huiwen_fun(str);
	return 0;
}

栈的头文件

//栈的头文件  ---  顺序存储
#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100

//typedef int DataType;
//typedef struct
//{
//	int x, y, d;		//横纵坐标及方向
//}DataType;

//typedef int DataType;
typedef char DataType;


typedef struct
{
	DataType data[MAXSIZE];
	int top;
}SeqStack,*PSeqStack;


//初始化栈
PSeqStack Init_SeqStack(void)
{
	/*创建一个顺序栈,入口参数无,返回指向顺序栈的指针*/
	PSeqStack S;
	S = (PSeqStack)malloc(sizeof(SeqStack));
	if (S)
		S->top = -1;
	return S;
}

//判断栈空
int Empty_SeqStack(PSeqStack S)
{
	/*判断栈是否为空  入口参数:顺序栈 返回值1为空 0非空*/
	if (S->top == -1)

		return 1;
	else
		return 0;
}

//入栈
int Push_SeqStack(PSeqStack S, DataType x)
{
	/*在栈顶插入一个新元素,入口参数:顺序栈 返回1表示成功   0表示失败*/
	if (S->top == MAXSIZE - 1)
		return 0;
	else
	{
		S->top++;
		S->data[S->top] = x;
		return 1;
	}
}

//出栈
int Pop_SeqStack(PSeqStack s, DataType* x)
{
	/*删除栈顶元素 并保存在*x中   入口参数 顺序栈 返回值 1表示成功  0表示失败*/
	if (Empty_SeqStack(s))
		return 0;				//栈空不能出栈
	else {
		*x = s->data[s->top];
		s->top--;
		return 1;
	}
}

//取栈顶元素
int GetTop_SeqStack(PSeqStack s, DataType *x)
{
	/*取出栈顶元素  入口参数:顺序栈 返回值 1表示成功  0表示失败*/
	if (Empty_SeqStack(s))
		return 0;
	else
		*x = s->data[s->top];
	return 1;
}

//销毁栈
void Destroy_Seqstack(PSeqStack* s)
{
	/*入口参数:要销毁的顺序栈指针地址  无返回值*/
	if (*s)
		free(*s);
	*s = NULL;
	return;
}

队列的头文件

#pragma once
/*队列的顺序存储  采用头尾相连循环结构*/
/*入队  Q->rear = (Q->rear+1)%MAXSIZE */
/*出队  Q->front =(Q->front+1)%MAXSIZE */

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

//typedef int DataType;
typedef char DataType;

#define MAXSIZE 100 /*队列最大容量*/

/*定义队列类型*/
typedef struct
{
	DataType data[MAXSIZE]; /*队列存储空间*/
	int front, rear;   /*队头和队尾指针*/
}SeqQueue,*PSeqQueue;

/*初始化队列*/
PSeqQueue Init_SeqQueue()
{
	PSeqQueue Q;
	Q = (PSeqQueue)malloc(sizeof(SeqQueue));
	if (Q)
	{
		Q->rear = 0;
		Q->front = 0;
	}
	return Q;
}

/*判断队列为空*/
int Empty_SeqQueue(PSeqQueue Q)
{
	/*入口参数 数顺序队列 
	  出口参数 1表示空  0表示非空 -1表示队列不存在 */
	if (Q && Q->front == Q->rear)
		return 1;
	else
		if (!Q)return -1;
		else return 0;
}

/*入队*/
int In_SeqQueue(PSeqQueue Q, DataType x)
{
	/*入口参数 顺序队列 入队元素 返回值 1表示成功 -1表示队满*/
	if ((Q->rear + 1) % MAXSIZE == Q->front)
	{
		printf("队满");
		return -1;
	}
	else
	{
		Q->rear = (Q->rear + 1) % MAXSIZE;
		Q->data[Q->rear] = x;
		return 1;
	}
}

/*出队*/
int Out_SeqQueue(PSeqQueue Q, DataType* x)
{
	/*入口参数  顺序队列 出对元素保存于*x中 返回-1表示队列为空 返回1表示出队成功*/
	if (Empty_SeqQueue(Q))
	{
		printf("队空");
		return -1;
	}
	else
	{
		Q->front = (Q->front + 1) % MAXSIZE;
		*x = Q->data[Q->front];
		return 1;
	}
}

/*读队头元素*/
int Front_SeqQueue(PSeqQueue Q, DataType* x)
{
	/*入口参数   顺序队列 元素取出存放地址 返回值1表示成功 -1表示队空*/
	if (Empty_SeqQueue(Q))
	{
		printf("队空");
		return -1;
	}
	else
	{
		*x = Q->data[(Q->front + 1) % MAXSIZE];    //循环队列队头无元素
		return 1;
	}
}

/*销毁队列*/
void Destroy_SeqQueue(PSeqQueue* Q)
{
	if (*Q)
		free(*Q);
	*Q = NULL;
	return;
}


/*在其余资料中也有将rear指针所指向的队列元素为空则 
 入队Q.data[Q->rear]=x;Q->rear=(Q->rear+1)%MAXSIZE
 出队亦然更改*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值