用顺序栈实现回文序列的判断(c语言)

35 篇文章 0 订阅
1 篇文章 0 订阅

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

首先是定义一个栈的结构元素,由于是字符串类型就直接定义一个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是否为回文序列

  • 14
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用C语言顺序栈可以实现判断回文的功能。回文是指正读和反读都相同的字符串。下面是使用顺序栈实现判断回文的步骤: 1. 定义一个顺序栈结构,包括栈的容量、栈顶指针和存储元素的数组。 2. 初始化栈,将栈顶指针置为-1。 3. 将待判断的字符串依次入栈,直到字符串结束。 4. 从字符串的开头开始遍历,将每个字符出栈并与当前遍历的字符进行比较。 - 如果相等,则继续遍历下一个字符。 - 如果不相等,则说明不是回文,返回false。 5. 如果遍历完整个字符串,且栈为空,则说明是回文,返回true;否则,返回false。 下面是使用C语言实现判断回文的代码示例: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; int top; } Stack; void initStack(Stack* stack) { stack->top = -1; } bool isEmpty(Stack* stack) { return stack->top == -1; } bool isFull(Stack* stack) { return stack->top == MAX_SIZE - 1; } void push(Stack* stack, char c) { if (isFull(stack)) { printf("Stack is full.\n"); return; } stack->data[++stack->top] = c; } char pop(Stack* stack) { if (isEmpty(stack)) { printf("Stack is empty.\n"); return '\0'; } return->data[stack->top--]; } bool isPalindrome(char* str) { Stack stack; initStack(&stack); // 将字符串入栈 int i = 0; while (str[i] != '\0') { push(&stack, str[i]); i++; } // 判断是否为回文 i = 0; while (str[i] != '\0') { if (pop(&stack) != str[i]) { return false; } i++; } return isEmpty(&stack); } int main() { char str[MAX_SIZE]; printf("请输入一个字符串:"); scanf("%s", str); if (isPalindrome(str)) { printf("%s 是回文。\n", str); } else { printf("%s 不是回文。\n", str); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新城已无旧少年_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值