C语言数据结构,使用静态栈和串判断字符串是否为回文

C语言数据结构,使用静态栈和串判断字符串是否为回文

判断思路如下:将字符串前一半入栈,然后,栈中元素和字符串后一半进行比较。即将第一个出栈元素和后一半串中第一个字符比较,若相等,则再出栈一个元素与后一个字符比较,……,直至栈空,结论为字符序列是回文。在出栈元素与串中字符比较不等时,结论字符序列不是回文。
代码如下

#include<stdio.h>

#define maxsize 30   

/*顺序静态栈*/
typedef struct Stack
{
	char data[maxsize];
	int top;//栈顶指针
}stack;

/*静态串*/
typedef struct Strand
{
	char data[maxsize];
	int  length;//串的实际长度
}strand;

/*初始化栈*/
void Initialize_stack(stack& S)
{
	S.top = 0;
}
/*初始化串*/
void Initialize_strand(strand& L)
{
	L.length = 0;
}


/*压栈*/
void pushstack(stack& S, char c)
{
	S.data[S.top] = c;
	S.top++;
}

/*入串*/
void pushstrand(strand& L, char c)
{

	L.data[L.length] = c;
	L.length++;
}

/*出栈*/
char popstack(stack& S)
{
	S.top--;
	return S.data[S.top];
}

/*出串*/
char popstrand(strand& L, int i)//增加一个参数i,使得从串头依次输出字符
{
	return L.data[i];
}

/*栈中数据出栈与串后一半比较*/
void compare(stack& S, strand& L)
{
	char a, b;
	/*
	其实不管是输入的字符串是奇数还是偶数,他们比较的次数始终是成对出现的,
	偶数的话很容易理解,对于奇数的话,中间的那个字符是不需要比较的,所以,
	只需要比较两边的字符即可,而:比较的次数=栈中的字符数=串中的字符数,
	也就是说:  int m = S.top ;等价于 int m = L.length;
	*/
	int m = S.top;
	int i = 0;
	char popstack(stack & S);
	char popstrand(strand & L, int i);
	printf("运算结果:");
	for (i = 0; i < m; i++)
	{
		a = popstack(S);//调用出栈函数,把栈顶字符赋给a
		b = popstrand(L, i);//调用出串函数,把栈顶字符赋给b
		/*
		下面的代码采用逆推的方式思考:
		如果字符串是回文,满足条件是:每一次的比较必须是相等的,也就是说:最后一次的比较是确定是否为回文的关键因素
		如果字符串不是回文,满足条件是:只需要有一次比较不相等即可
		*/
		if (i == m - 1) //最后一次比较,如果a,b相等了,那么就一定是回文
		{
			if (a == b)
			{
				printf("这是回文\n");
			}
		}
		if (a != b)
		{
			printf("这不是回文\n");
			i = m;  //只需要有一次比较是不相等,就不需要再继续循环比较了,直接给i赋值跳过循环即可
		}


	}

}

/*主方法*/
int main()
{
	stack S;
	strand L;
	int j = 0, k = 0, i = 0;
	char str[maxsize], c;
	void pushstack(stack & S, char c);
	void pushstrand(strand & L, char c);
	void compare(stack & S, strand & L);
	void Initialize_stack(stack & S);
	void Initialize_strand(strand & L);
	Initialize_strand(L);
	Initialize_stack(S);
	printf("请输入想要查询的字符串:");
	gets_s(str);
	for (int i = 0; i < maxsize; i++)//设置一个计数器,找出实际输入个数
	{
		if (str[i] == '\0')//当字符为 '\0'时,执行此段语句
		{
			j = i;//此时把i的值赋予j,而j就是输入数据的实际个数
		}
	}
	k = j;//中间数据,在后部分字符串入串的时候需要用到



	if (j % 2 == 0)//如果传入的字符串是偶数个,执行以下代码
	{
		j = j / 2;
		/*把字符串的前一半传入栈中*/
		for (i = 0; i < j; i++)
		{

			c = str[i];
			pushstack(S, c);
		}
		/*把字符串的后一半传入串中*/
		for (i = j; i < k; i++)
		{
			c = str[i];
			pushstrand(L, c);
		}
	}
	else if (j % 2)//如果传入的字符串是奇数个,执行以下代码
	{
		j = (j - 1) / 2;
		/*把字符串的前一半传入栈中*/
		for (i = 0; i < j; i++)
		{
			c = str[i];
			pushstack(S, c);
		}
		/*把字符串的后一半传入串中*/
		for (i = j + 1; i < k; i++)
		{
			c = str[i];
			pushstrand(L, c);
		}
	}
	compare(S, L);//调用比较函数
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
如果有什么不合适的地方,还请指出。。。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言可以利用和队列来判断一个字符串是否回文。具体实现方法如下: 1. 利用实现判断回文:将字符串的前一半字符依次入,然后依次将后一半字符与中的字符进行比较,如果全部相同,则该字符串回文。 2. 利用队列实现判断回文:将字符串的前一半字符依次入队列,然后依次将后一半字符与队列中的字符进行比较,如果全部相同,则该字符串回文。 下面是利用实现判断回文C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; int top;} Stack; void initStack(Stack *s) { s->top = -1; } int isEmpty(Stack *s) { return s->top == -1; } int isFull(Stack *s) { return s->top == MAX_SIZE - 1; } void push(Stack *s, char c) { if (isFull(s)) { printf("Stack is full.\n"); exit(1); } s->data[++s->top] = c; } char pop(Stack *s) { if (isEmpty(s)) { printf("Stack is empty.\n"); exit(1); } return s->data[s->top--]; } int isPalindrome(char *str) { int len = strlen(str); Stack s; initStack(&s); int i; for (i = 0; i < len / 2; i++) { push(&s, str[i]); } if (len % 2 != 0) { i++; } while (i < len) { if (pop(&s) != str[i]) { return 0; } i++; } return 1; } int main() { char str[MAX_SIZE]; printf("Please input a string: "); scanf("%s", str); if (isPalindrome(str)) { printf("%s is a palindrome.\n", str); } else { printf("%s is not a palindrome.\n", str); } return 0; } ``` 下面是利用队列实现判断回文C语言代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; int front; int rear; } Queue; void initQueue(Queue *q) { q->front = q->rear = -1; } int isEmpty(Queue *q) { return q->front == -1; } int isFull(Queue *q) { return (q->rear + 1) % MAX_SIZE == q->front; } void enqueue(Queue *q, char c) { if (isFull(q)) { printf("Queue is full.\n"); exit(1); } if (isEmpty(q)) { q->front = q->rear = 0; } else { q->rear = (q->rear + 1) % MAX_SIZE; } q->data[q->rear] = c; } char dequeue(Queue *q) { if (isEmpty(q)) { printf("Queue is empty.\n"); exit(1); } char c = q->data[q->front]; if (q->front == q->rear) { q->front = q->rear = -1; } else { q->front = (q->front + 1) % MAX_SIZE; } return c; } int isPalindrome(char *str) { int len = strlen(str); Queue q; initQueue(&q); int i; for (i = 0; i < len / 2; i++) { enqueue(&q, str[i]); } if (len % 2 != 0) { i++; } while (i < len) { if (dequeue(&q) != str[i]) { return 0; } i++; } return 1; } int main() { char str[MAX_SIZE];

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值