1. 程式人生 > >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>

         輸入的字串為:[email protected]

         輸出的結果為:

         輸入的字串為:[email protected]

         輸出的結果為: