迴文判斷———資料結構棧的應用(一)
阿新 • • 發佈:2019-01-08
一、演算法思想:
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; }
棧的應用還有很多:比如括號匹配,表示式求值,二進位制的轉換,二叉樹非遞迴的遍歷等。