DS之順序棧和鏈隊實現迴文判斷,ds順序迴文
順序棧和鏈隊的基本操作就不再一一列舉了,要想實現迴文判斷,先來瞭解什麼是迴文?“迴文”一字串正著讀和反著讀是相同的字元序列,如“abcba”,"abba"為"迴文",“abab”則不是“迴文”。
其次就是順序棧和鏈隊如何?迴文的判斷?將輸入的字串依次入棧和入隊,然後再依次出棧和出隊,由於入棧和入隊是相同的序列,然而出棧和出隊是相反的序列,這就實現了迴文的判斷。
最後考慮要用到順序棧和鏈隊的什麼基本操作?需要用到棧的基本操作為;1構造一個空棧,2判斷棧是否為空白,7出棧,8進棧。需要用到鏈隊的基本操作為:1初始化鏈隊,7出隊,8入隊。
實現判斷迴文的函數代碼為:
<span style="font-size:18px;">Status huiwen(SqStack &S,LinkQueue &Q)//判斷迴文的函數{char a,b,c;c=getchar();//接受輸入的字串 while(c!='@') { Push(S,c); EnQueue(Q,c);c=getchar();} while(!StackEmpty(S)) { Pop(S,a); DeQueue(Q,b); } if(a!=b) { return ERROW; } else { return OK; }} </span>
在主函數中只需構建一個順序棧和鏈隊,再定義一個接受輸入的字串,基本上就實現了迴文的判斷,輸入一個以“@”結束的字串,迴文判斷的代碼為:
<span style="font-size:18px;">#include <iostream>using namespace std;//兩個C語言的標頭檔庫#include <malloc.h>#include <stdlib.h>//以下是宏定義#define OK 1#define ERROW 0#define OVERFLOW -2#define TRUE 1#define FALSE 0#define INFEASIBLE -1#define STACK_INIT_SIZE 100//儲存空間初始分配量#define STACKINCREMENT 10//儲存空間分配增量//以下是類型重新定義typedef char SElemType;//重新定義SElemType為int型typedef int Status;//重新定義Status為int型typedef char QElemType;//重新定義QElemType為int型//下面的是棧的定義和基本操作typedef struct{//重新定義SqStck為結構類型SElemType *base;//棧底指標SElemType *top;//棧頂指標int stacksize;//棧的當前可使用的最大容量}SqStack;typedef struct QNode{//重新定義一個結點結構 QElemType data; struct QNode *next;}QNode, *QueuePtr;typedef struct {//定義的一個鏈隊 QueuePtr front;//隊頭指標 QueuePtr rear;//隊尾指標}LinkQueue;//定義的一個結構變數 //1初始化隊列Status InitQueue(LinkQueue &Q){ Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(!Q.front){exit(OVERFLOW);} Q.front->next=NULL; return OK;}//入隊列Status EnQueue(LinkQueue &Q,QElemType e){ QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p) {exit(OVERFLOW);} p->data=e; p->next=NULL; Q.rear->next=p; Q.rear=p; return OK; }//出隊列Status DeQueue(LinkQueue &Q,QElemType &e){ if(Q.front==Q.rear) { return ERROW; } QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) { Q.rear=Q.front; } free(p); return OK;}//1構造一個空棧Status InitStack(SqStack &S){S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base){exit(OVERFLOW);//儲存分配失敗}S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}//2判斷棧是否為空白Status StackEmpty(SqStack S){if(S.base==S.top){return TRUE;}else{return FALSE;}}//7出棧Status Pop(SqStack &S,SElemType &e){if(S.top==S.base){return ERROW;}e=*--S.top;return OK;}//8進棧Status Push(SqStack &S,SElemType e){if(S.top-S.base>=S.stacksize){//棧滿追加儲存空間SElemType *newbase=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!newbase){exit(OVERFLOW);}S.base=newbase;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status huiwen(SqStack &S,LinkQueue &Q) {char a,b,c;c=getchar();//接受輸入的字串 while(c!='@') { Push(S,c); EnQueue(Q,c);c=getchar();} while(!StackEmpty(S)) { Pop(S,a); DeQueue(Q,b); } if(a!=b) { return ERROW; } else { return OK; }} int main(){ SqStack s;// LinkQueue q;InitStack(s); InitQueue(q);char *array1=new char[100];cout<<"輸入你所要驗證的字串:";if(huiwen(s,q)){cout<<"這是迴文";}else{cout<<"這不是迴文";}return 0;}</span>
輸入的字串為:abcba@
輸出的結果為:
輸入的字串為:abcde@
輸出的結果為: