利用棧和隊來判斷輸入的一個字串是否為迴文

學習程式碼的小白發表於2020-10-31

/*判斷迴文的思想:
就是利用棧的先進後出,隊的先進先出特性;
將一個字串分別入棧,入隊,再將它們分別出棧,出隊;
此時的出來的元素一個是字串的尾端的字元,一個是字串首端的字元,就將兩者進行比較
若相等就繼續迴圈判斷;若不相等就可以直接判斷不為迴文字串
*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50//定義棧和隊的最大儲存
//定義棧的儲存結構
typedef struct
{
char data[MAXSIZE];
int top;
}SeqStack;
//初始化棧
void InitSeqStack(SeqStack *s)
{
s->top=-1;
}
//判斷棧是否為空
int Empty(SeqStack *s)
{
if(s->top==-1)
return 0;//若為空返回0
else
return 1;
}
//入棧
void pushzhan(SeqStack *s,char x)
{
if(s->topMAXSIZE-1)
printf(“棧滿”);
else
{
s->top++;
s->data[s->top]=x;
}
}
//出棧
char Popzhan(SeqStack *s)
{
char x;
if(s->top
-1)
return 0;
else
{
x=s->data[s->top];
s->top–;
return x;
}//返回字元x
}/*出棧的函式,將棧頂元素出棧並儲存在x中;
與取棧頂的函式不同的是將出棧的元素不再儲存在棧中 */

//定義隊的儲存結構
typedef struct {
char data[MAXSIZE];
int front; //指向隊的首位置
int rear; //指向隊的尾位置
}Queue;

//初始化隊
void InitDui(Queue *q)
{
q->front=q->rear=0;
}

//入隊
void pushdui(Queue *q,char e)
{
if((q->rear+1)%MAXSIZE==q->front)
{
printf(“佇列為空\n”);
}
else
{
q->data[q->rear]=e;
q->rear=(q->rear+1);
}
}

//出隊
char PopDui(Queue *q)
{
char f;
if(q->front==q->rear)
{
printf(“佇列為空\n”);
return 0;
}
else
{
f=q->data[q->front];
q->front=(q->front+1);
return f; //返回字元f
}
}

int main()
{
char c;
int y=0;
//SeqStack *s=(SeqStack *)malloc(sizeof(SeqStack));
SeqStack *s;
s = new SeqStack;//為棧s申請空間
// Queue *q=(Queue *)malloc(sizeof(Queue));
Queue *q;
q = new Queue;
InitSeqStack(s);
InitDui(q);
printf(“輸入一個字串:\n”);
while((c=getchar())!=’#’)
{
pushzhan(s,c); //將字串入棧
pushdui(q,c); //將字串入隊
}
while(Empty(s)) //當棧不為空的時候,就會執行下列的迴圈
{
if(Popzhan(s)PopDui(q)) //將出棧的元素與出隊的元素進行比較
{
y=1; //如果兩者相同,就將y賦值為1
continue;//返回迴圈最開始的地方(while(padz(s)))
}
else
{
y=0;
break; //如果兩者不相同,就直接結束迴圈,進行下面(if(y
1))的語句執行
}
}
/迴圈中的break語句和continue語句的區別
break:執行到這句語句時候,滿足條件時,就直接退出迴圈
continue:執行到這句語句的時候,滿足條件時,不再執行此層迴圈,回到迴圈的開始
/
if(y==1)
printf(“此字串為迴文\n”);
else
printf(“此字串不是迴文\n”);
return 0;
}

//喜歡的加一個關注吧,一個正在努力學習的大二小白

相關文章