C语言如何用顺序栈实现回文序列判断

 更新时间:2021年10月15日 16:00:51   作者:正在学c的小白  
这篇文章主要为大家介绍了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语言顺序栈实现回文序列判断的资料请关注脚本之家其它相关文章!

相关文章

  • C++11中异常处理机制详解

    C++11中异常处理机制详解

    传统的C语言处理异常的方式有两种:终止程序和返回错误码。在实际中的C语言程序基本都是通过返回错误码的方式来处理错误的,部分情况下使用终止程序来处理比较严重的错误。本文将通过示例和大家聊聊C++11中异常处理机制,需要的可以参考一下
    2022-09-09
  • C++实例详解lambda表达式的使用

    C++实例详解lambda表达式的使用

    Lambda表达式是现代C++在C ++ 11和更高版本中的一个新的语法糖 ,在C++11、C++14、C++17和C++20中Lambda表达的内容还在不断更新。 lambda表达式(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法
    2022-05-05
  • C++炸弹小游戏示例代码

    C++炸弹小游戏示例代码

    这篇文章主要介绍了C++炸弹小游戏,本文给大家分享游戏代码,代码简单易懂通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • C语言 数据结构之链表实现代码

    C语言 数据结构之链表实现代码

    这篇文章主要介绍了C语言 数据结构之链表实现代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • C语言编程简单却重要的数据结构顺序表全面讲解

    C语言编程简单却重要的数据结构顺序表全面讲解

    这篇文章主要为大家介绍了C语言编程中非常简单却又非常重要的数据结构顺序表的全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • C++ this原理与可变参数及友元函数友元类分步详解用法

    C++ this原理与可变参数及友元函数友元类分步详解用法

    可变参数模板(variadic templates)是C++11新增的强大的特性之一,它对模板参数进行了高度泛化,能表示0到任意个数、任意类型的参数,这篇文章主要介绍了C++ this原理与可变参数及友元函数友元类
    2022-11-11
  • C语言基于考研的栈和队列

    C语言基于考研的栈和队列

    这篇文章主要介绍了考研时的C语言中的堆栈和队列的相关资料,需要的朋友可以参考下,小编觉得这篇文章写的很好,希望能给你带来帮助
    2021-08-08
  • C语言实现学生宿舍管理系统

    C语言实现学生宿舍管理系统

    这篇文章主要为大家详细介绍了C语言实现学生宿舍管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Clion2020.2.x最新激活码破解版附安装教程(Mac Linux Windows)

    Clion2020.2.x最新激活码破解版附安装教程(Mac Linux Windows)

    Clion2020增加了很多新特性,修复了大量bug,大大提高了开发效率。这篇文章主要介绍了Clion2020.2.x最新激活码破解版附安装教程(Mac Linux Windows),需要的朋友可以参考下
    2020-11-11
  • c++中为什么不提倡使用vector示例详解

    c++中为什么不提倡使用vector示例详解

    这篇文章主要给大家介绍了关于c++中为什么不提倡使用vector的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论