1. 程式人生 > >迴文判斷———資料結構棧的應用(一)

迴文判斷———資料結構棧的應用(一)

一、演算法思想:

          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;
}

棧的應用還有很多:比如括號匹配,表示式求值,二進位制的轉換,二叉樹非遞迴的遍歷等。