(二)栈、队列、链表—— 2. 栈

2. 栈

2.1 基本概念

后进先出的数据结构,它叫做。栈限定为只能在一端进行插入和删除操作。


2.2 编程思想

栈究竟有哪些作用呢?

来看一个例子。“xyzyx”是一个回文字符串,所谓回文字符 串就是指正读反读均相同的字符序列。通过栈这个数据结构很容易判断一个字符串是否为回文。

首先我们读取这行字符串,并求出这个字符串的长度。

char a[101];
int len;
gets(a);
len = strlen(a);

如果一个字符串是回文的话,那么它必须是中间对称的,需要求中点,即:

mid = len/2-1

先将 mid 之前的字符全部入栈。因为这里的栈是用来存储字符的,所以用来实现栈的数组类型是字符数组即 chars[101];,初始化栈,top=0;就可以了。入栈的操作 是top++;s[top]=x(;假设需要入栈的字符暂存在字符变量x中),可以简写为s[++top]=x;。将 mid 之前的字符依次全部入栈,如下:

for (i=0; i<=mid; i++) {
	s[++top] = a[i];
}

接下来进入判断回文的关键步骤。将当前栈中的字符依次出栈,看看是否能与 mid 之后 的字符一一匹配,如果都能匹配则说明这个字符串是回文字符串,否则这个字符串就不是回 文字符串。

for (i=mid+1; i<=len-1; i++) {
	if (a[i] != s[top]) {
		break;
	}
	top--;
}
if (top==0) {
	printf("YES");
} else {
	printf("NO");
}

最后如果 top 的值为 0,就说明栈内所有的字符都被一一匹配了,那么这个字符串就是 回文字符串。完整的代码如下:

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

int main() {
	char a[101], s[101];
	int i, len, mid, next, top;

	gets(a);//读入一行字符串
	len = strlen(a);//求字符串的长度
	mid = len/2-1;//求字符串的中点
	
	top = 0;//栈的初始化
	//将mid前的字符依次入栈
	for (i=0; i<=mid; i++) {
		s[++top] = a[i];
	}

	//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
	if (len%2==0) {
		next = mid+1;
	} else {
		next = mid+2;
	}

	//开始匹配
	for (i=next; i<=len-1; i++) {
		if (s[top]!=a[i]) {
			break;
		}
		top--;
	}

	//如果top的值为0,则说明栈内所有的字符都被一一匹配了
	if (top==0) {
		printf("%s\n", "YES");
	} else {
		printf("%s\n", "NO");
	}

	getchar();getchar();
	return 0;

}

输入数据:
ahaha

返回值:
YES





参考

《啊哈!算法》 —— 第2章 栈、队列、链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值