温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言怎么用顺序栈实现回文序列判断

发布时间:2021-10-15 17:27:25 来源:亿速云 阅读:283 作者:小新 栏目:开发技术

这篇文章将为大家详细讲解有关C语言怎么用顺序栈实现回文序列判断,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

我是采用了两个栈值得比较大小判断得(可能比较浪费空间但是代码我感觉简单一点)

首先是定义一个栈的结构元素,由于是字符串类型就直接定义一个char的数组就可以:.

typedef struct stack {     char data[MAX_SIZE];      //储存字符串//      int top;                  //记录栈顶//  }SeqStack;

下来就是初始化,我这里是用的耿国华老师的方法就直接给一个top元素指向栈顶,传入的指针地址:.

void Initstack(SeqStack *S)   //初始化栈,让top指向栈顶//  {	S->top=-1; }

下面就是创建顺序栈了,元素只要没满就一直可以入住:

int Push(SeqStack *S,char x)  //压栈,只要top小于MAX_SIZE-1就可以继续入栈//  {	if(S->top<=MAX_SIZE-1)	{	S->top++;	S->data[S->top]=x;     }else{     	return -1;;	} }

下面是核心函数,操作实现回文序列的判断,我注释的比较清楚直接看就可以了:

void Pop(SeqStack *S)        //出栈操作,也是最主要的操作//  {	SeqStack *p;                       	p=(SeqStack*)malloc(sizeof(SeqStack));  //建立一个新的空栈,由于是指针类型要分配动态地址//	Initstack(p);                           //给新的栈进行初始化// 	int i=S->top/2;                         //i用来分割两个字符串,将第二个字符串赋给新的空栈// 	int j=i-1;                              //j用来记录除了@之外的其他字符数量大小// 	while(S->top!=i)                        //开始对空栈进行赋值,对原来的栈开始清空(清空一般大小)// 	{	p->top++;	p->data[p->top]=S->data[S->top];	S->top--;     }     S->top=S->top-2;                        //让原来的栈直接指向数字,跨过了字符@//      for(int k=0;k<i-1;k++)                  //循环次数由i-1决定,也就是出去@字符之后的其他需要比较的字符//      {     	if(S->data[S->top]==p->data[p->top])  //由于栈的特点先进后出,所以新栈的存储顺序和去掉@字符之后的旧栈的存储顺序是一样的,所以这里直接比较//      	{     	j--;                             //j是定义需要比较字符的大小,只要两个栈的元素ASCLL相等j就减一,如果全部相等j为0,该字符串就是互为回文序列// 	}	S->top--;                            //两个top指针向下值//      	p->top--;	if(j==0)                         //判断// 	{	printf("两个字符串互为回文序列!");	}	}	if(j!=0)	{	printf("两个字符串不互为回文序列!");	}	free(p);                       //free掉分配的空间//  }

下面附上整个代码:

#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 100 typedef struct stack {     char data[MAX_SIZE];      //储存字符串//      int top;                  //记录栈顶//  }SeqStack; void Initstack(SeqStack *S)   //初始化栈,让top指向栈顶//  {	S->top=-1; } int Push(SeqStack *S,char x)  //压栈,只要top小于MAX_SIZE-1就可以继续入栈//  {	if(S->top<=MAX_SIZE-1)	{	S->top++;	S->data[S->top]=x;     }else{     	return -1;;	} } void Pop(SeqStack *S)        //出栈操作,也是最主要的操作//  {	SeqStack *p;                       	p=(SeqStack*)malloc(sizeof(SeqStack));  //建立一个新的空栈,由于是指针类型要分配动态地址//	Initstack(p);                           //给新的栈进行初始化// 	int i=S->top/2;                         //i用来分割两个字符串,将第二个字符串赋给新的空栈// 	int j=i-1;                              //j用来记录除了@之外的其他字符数量大小// 	while(S->top!=i)                        //开始对空栈进行赋值,对原来的栈开始清空(清空一般大小)// 	{	p->top++;	p->data[p->top]=S->data[S->top];	S->top--;     }     S->top=S->top-2;                        //让原来的栈直接指向数字,跨过了字符@//      for(int k=0;k<i-1;k++)                  //循环次数由i-1决定,也就是出去@字符之后的其他需要比较的字符//      {     	if(S->data[S->top]==p->data[p->top])  //由于栈的特点先进后出,所以新栈的存储顺序和去掉@字符之后的旧栈的存储顺序是一样的,所以这里直接比较//      	{     	j--;                             //j是定义需要比较字符的大小,只要两个栈的元素ASCLL相等j就减一,如果全部相等j为0,该字符串就是互为回文序列// 	}	S->top--;                            //两个top指针向下值//      	p->top--;	if(j==0)                         //判断// 	{	printf("两个字符串互为回文序列!");	}	}	if(j!=0)	{	printf("两个字符串不互为回文序列!");	}	free(p);                       //free掉分配的空间//  } int main() {	SeqStack S;	char x;	int m=0;	Initstack(&S);	printf("请输入第一串字符\n");	while(m!=2)                            //因为只需要输入两个字符串的判断,判断条件为m!=2// 	{	    scanf("%c",&x);	    if(x=='@')                           //输入@后表明第一个字符串结束// 	    {	    	m++;	        if(m==1)	        {	        	printf("请输入第二串字符:\n");	     	}     	}      	Push(&S,x);     }     Pop(&S);	return 0; }

下面加一个例子:

判断3+1与1+3是否为回文序列

C语言怎么用顺序栈实现回文序列判断

关于“C语言怎么用顺序栈实现回文序列判断”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI