以前寫的,用循環(huán)隊列和順序棧實現(xiàn)的
也可以用指針實現(xiàn)
分別有兩個指針,一個指向開始,一個指向結尾,各取一個字符比較,相等的話,前邊的向后移動一個,后邊的向前移動一個,直到兩個指針指向同一個位置,則為回文,中途要是不相等或者最后沒有指向同一個位置,則不是回文
////
//數(shù)據(jù)結構:循環(huán)隊列和順序棧
//算法思想:
//1.將字符串按照用戶輸入的順序分別入棧和隊列
//2.分別從隊列和棧中取出首個字符
//3.比較取出的字符,若相等,繼續(xù)分別從隊列和棧中取首個字符;否則跳出循環(huán),并設置標志flag=0;
//4.若隊列和棧中的字符取完,則結束,設置標志flag=1;
//5.flag=1,表示字符從前往后和從后往前的序列完全匹配,該字符串屬于回文
//6.flag=0,表示字符從前往后和從后往前的序列不完全匹配,該字符串不屬于回文
#include
#include
#define m 100
typedef struct
{
char stack[m];
inttop;
}stackstru;// 定義棧
typedef struct {
char queue[m];
intfront;
intrear;
}queuestru; //定義隊列
voidmain()
{
//函數(shù)聲明
int stinit(stackstru *s); //初始化順序棧
int stempty(stackstru *s);//判斷棧是否為空
int stpush(stackstru *s,char x);//入棧
char stpop(stackstru *s); //出棧
int quinit(queuestru *q); //初始化循環(huán)隊列
int quempty(queuestru *q);//判斷隊列是否為空
int enqueue(queuestru *q,char e); //入隊
char dequeue(queuestru *q); //出隊
//
char c;
int flag=0;
stackstru *s=(stackstru *)malloc(sizeof(stackstru)); //為順序棧申請空間
queuestru *q=(queuestru *)malloc(sizeof(queuestru)); //為隊列申請空間
stinit(s); //初始化棧
quinit(q); //初始化隊列
printf("Input a string:\n");//輸入字符串,輸入@標示輸入結束.
while((c=getchar())!='@') //將輸入的字符串入棧和隊列
{
putchar(c); //輸出輸入的字符
stpush(s,c);//字符進棧
enqueue(q,c); //字符進隊列
}
printf("\n");
printf("End input!\n"); //提示信息
while(stempty(s)) //棧中還有元素
{
if(stpop(s)==dequeue(q)) //出棧的字符與出隊列的字符匹配
{
flag=1; //將標志設置為1
continue; //繼續(xù)從棧和隊列中區(qū)字符
}
else //字符不匹配
{
flag=0;
break;//跳出循環(huán),將標志設置為0
}
}
if(flag==1)
printf("This string is palindrome!\n"); //標志位為1,完全匹配,是回文
else
printf("This string isn't palindrome!\n");//標志位為0,不完全匹配,不是回文
}
int stinit(stackstru *s)
{
s->top=0;
return 1;
} //初始化棧
int stempty(stackstru *s)
{
if(s->top==0) //棧頂為空
{
return 0;
}
else
{
return 1;
}
} //判斷棧是否空
int stpush(stackstru *s,char x)
{
if(s->top==m)//棧滿
{
printf("The stack is overflow!\n"); //輸出提示信息
return 0;
}
else //棧未滿
{
s->top=s->top+1;//棧頂后移
s->stack[s->top]=x; //字符入棧
return 1;
}
}//入棧操作
char stpop(stackstru *s)
{
char y;
if(s->top==0)//棧為空
{
printf("The stack is empty!\n"); //輸出提示信息
return ' ';//返回空格
}
else //棧不為空
{
y=s->stack[s->top];//取出棧頂元素
s->top=s->top-1; //棧頂指示移動
return y;
}
} //出棧操作
int quinit(queuestru *q)
{
q->front=0;
q->rear=0;
return 1;
}//初始化為一個空的循環(huán)隊列
int quempty(queuestru *q)
{
if(q->front==q->rear) //隊頭和隊尾相等
{
return 0;
}
else
{
return 1;
}
}//判斷隊列是否為空
int enqueue(queuestru *q,char e)
{
if((q->rear+1)%m==q->front) //隊列已滿
{
printf("The queue is overflow!\n"); //提示信息
return 0;
}
else
{
q->queue[q->rear]=e;//入隊
q->rear=(q->rear+1)%m;//移動隊尾指針
return 1;
}
} //入隊操作
char dequeue(queuestru *q)
{
char f;
if(q->front==q->rear)//隊列為空
{
printf("The queue is empty!\n");//提示信息
return 0;
}
else
{
f=q->queue[q->front]; //取出隊首元素
q->front=(q->front+1)%m;//移動對頭指針
return f;
}
}//出隊操作
假設稱正讀和反讀都相同的字符序列為“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’則不是回文.試寫一個算法判別讀入的一個以‘@’為結束符的字符序列是否是“回文”.
假設稱正讀和反讀都相同的字符序列為“回文”,例如,‘abba’和‘abcba’是回文,‘abcde’和‘ababab’則不是回文.試寫一個算法判別讀入的一個以‘@’為結束符的字符序列是否是“回文”.
其他人氣:561 ℃時間:2020-07-02 21:13:58
優(yōu)質解答
我來回答
類似推薦
- 1、代碼填空 形如:“abccba”,“abcba”的串稱為回文串,下列代碼判斷一個串是否為回文串.請補充空白的
- 英語翻譯
- 將粉筆頭輕放在以2m/s運動的傳送帶上,傳送帶留下一條長度為4米的劃線.請問,為什么劃線的長度等于傳送帶的位移減去物體的位移?請詳解,
- <<湯姆索亞歷險記>>以什么為線索,鞭撻了什么?
- 桂花雨主要內容?30字以上
- 誰能幫我想個詞來形容這個人
- (找等量關系列方程)
- 等比數(shù)列{an}中,a1+a2=8,a3-a1=16,則a3等于( ?。?A.20 B.18 C.10 D.8
- 根據(jù)句意及首字母提示完成字母
- on foot是什么詞(動詞還是.)
- ﹙1-1/2²﹚﹙1-1/3²﹚...﹙1-1/2013²﹚
- 高三數(shù)列題急求
猜你喜歡
- 1自天然藥物提取液中識別生物堿是否存在的主要反應及其試劑有哪些
- 2已知函數(shù)f ( x )等于(cos x)的四次方減去2sin xcos x減去(sin x)的四次方.1)求f ( x ) 的最小正周期;...
- 3在9 8 7 6 5 4 3 2 1=20添上加減乘除使等式成立
- 4用“攛掇”“絮叨”“怠慢”造句
- 5△ABC中,B>90° a=2x-5 b=x+1 c=4 求 x的取值范圍.
- 6Experience more than sufficiently teaches that men govern nothing with more difficult than their tongues.問govern sth wit
- 7氧化銅與稀硫酸反應的化學方程式
- 8為什么高中化學先學的離子反應再學氧化還原反應 離子反應里面有好多寫的時候要用到氧化還原的知識的啊
- 9已知:關于x的方程kx^2-(4k+1)x+3k+3=0
- 10語文作文:如何審題?如何理解話題?
- 11先生的讀音,生是讀一聲還是輕聲
- 12額定電壓220V、容量100L、電阻24.2Ω的電熱水器,它的電功率是多少?