DS之順序棧和鏈隊實現迴文判斷
阿新 • • 發佈:2019-01-08
順序棧和鏈隊的基本操作就不再一一列舉了,要想實現迴文判斷,先來了解什麼是迴文?“迴文”一字串正著讀和反著讀是相同的字元序列,如“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>
輸入的字串為:[email protected]
輸出的結果為:
輸入的字串為:[email protected]
輸出的結果為: