一、算法思想:
1、栈的性质:先进后出或后进先出的特性,栈的实现也很简单,只需要一个一维数组和一个指向栈顶的变量top就可 以了。我们通过变量top来对栈进行插入和删除操作。如图:
2、回文:回文字符串就是从前向后看个从后向前看都是一样的字符串。例如,“dad”,madam,”sees”都是回文串,但是”hello“就不 是的。检查回文字符串的一个方法就是用栈。
3、解法一:把字符串中点mid以前的字符压入栈中,再从中点mid后字符开始一一进行与栈中字符比较即可。
解法二:读一个字符串的时候都是先读一个个的字符,然后把每个已读字符放入栈中。这样字符串在栈中就是反的,然后把一个个的字 符从栈中弹 出,同时和原字符串的开头比较。如果任何位置的两个比较的字符串都相同,那么字符串就是回文,否则就不是。
二、算法代码实现(解法一):
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
char a[101],s[101];
int len,mid,next,top;
gets(a);
len = strlen(a);
mid = len/2 - 1; 求字符串的中点(需要入栈的字符串)
top = 0; //初始化栈
for(int i = 0; i <= mid; ++i)//将mid前的字符依次入栈
{
s[++top] = a[i];
}
//判断字符串的长度的是奇数还是偶数,并找出需要进行字符匹配的起始下标
if(len % 2 == 0)
{
next = mid + 1;
}
else
{
next = mid + 2;
}
//开始匹配
for(i = next; i <= len-1; ++i)
{
if(a[i] != s[top])
{
break;
}
else
top--;
}
//如果top的值为0,则说明栈内的所有的字符都被一一匹配了
if(top==0)
printf("YES\n");
else
printf("NO\n");
return 0;
}
栈的应用还有很多:比如括号匹配,表达式求值,二进制的转换,二叉树非递归的遍历等。