DS之順序棧和鏈隊實現迴文判斷,ds順序迴文

來源:互聯網
上載者:User

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@

         輸出的結果為:

 

 

 


 

 


 


 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.