您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關C語言怎么用順序棧實現回文序列判斷,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
我是采用了兩個棧值得比較大小判斷得(可能比較浪費空間但是代碼我感覺簡單一點)
首先是定義一個棧的結構元素,由于是字符串類型就直接定義一個char的數組就可以:.
typedef struct stack { char data[MAX_SIZE]; //儲存字符串// int top; //記錄棧頂// }SeqStack;
下來就是初始化,我這里是用的耿國華老師的方法就直接給一個top元素指向棧頂,傳入的指針地址:.
void Initstack(SeqStack *S) //初始化棧,讓top指向棧頂// { S->top=-1; }
下面就是創建順序棧了,元素只要沒滿就一直可以入住:
int Push(SeqStack *S,char x) //壓棧,只要top小于MAX_SIZE-1就可以繼續入棧// { if(S->top<=MAX_SIZE-1) { S->top++; S->data[S->top]=x; }else{ return -1;; } }
下面是核心函數,操作實現回文序列的判斷,我注釋的比較清楚直接看就可以了:
void Pop(SeqStack *S) //出棧操作,也是最主要的操作// { SeqStack *p; p=(SeqStack*)malloc(sizeof(SeqStack)); //建立一個新的空棧,由于是指針類型要分配動態地址// Initstack(p); //給新的棧進行初始化// int i=S->top/2; //i用來分割兩個字符串,將第二個字符串賦給新的空棧// int j=i-1; //j用來記錄除了@之外的其他字符數量大小// while(S->top!=i) //開始對空棧進行賦值,對原來的棧開始清空(清空一般大小)// { p->top++; p->data[p->top]=S->data[S->top]; S->top--; } S->top=S->top-2; //讓原來的棧直接指向數字,跨過了字符@// for(int k=0;k<i-1;k++) //循環次數由i-1決定,也就是出去@字符之后的其他需要比較的字符// { if(S->data[S->top]==p->data[p->top]) //由于棧的特點先進后出,所以新棧的存儲順序和去掉@字符之后的舊棧的存儲順序是一樣的,所以這里直接比較// { j--; //j是定義需要比較字符的大小,只要兩個棧的元素ASCLL相等j就減一,如果全部相等j為0,該字符串就是互為回文序列// } S->top--; //兩個top指針向下值// p->top--; if(j==0) //判斷// { printf("兩個字符串互為回文序列!"); } } if(j!=0) { printf("兩個字符串不互為回文序列!"); } free(p); //free掉分配的空間// }
下面附上整個代碼:
#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 100 typedef struct stack { char data[MAX_SIZE]; //儲存字符串// int top; //記錄棧頂// }SeqStack; void Initstack(SeqStack *S) //初始化棧,讓top指向棧頂// { S->top=-1; } int Push(SeqStack *S,char x) //壓棧,只要top小于MAX_SIZE-1就可以繼續入棧// { if(S->top<=MAX_SIZE-1) { S->top++; S->data[S->top]=x; }else{ return -1;; } } void Pop(SeqStack *S) //出棧操作,也是最主要的操作// { SeqStack *p; p=(SeqStack*)malloc(sizeof(SeqStack)); //建立一個新的空棧,由于是指針類型要分配動態地址// Initstack(p); //給新的棧進行初始化// int i=S->top/2; //i用來分割兩個字符串,將第二個字符串賦給新的空棧// int j=i-1; //j用來記錄除了@之外的其他字符數量大小// while(S->top!=i) //開始對空棧進行賦值,對原來的棧開始清空(清空一般大小)// { p->top++; p->data[p->top]=S->data[S->top]; S->top--; } S->top=S->top-2; //讓原來的棧直接指向數字,跨過了字符@// for(int k=0;k<i-1;k++) //循環次數由i-1決定,也就是出去@字符之后的其他需要比較的字符// { if(S->data[S->top]==p->data[p->top]) //由于棧的特點先進后出,所以新棧的存儲順序和去掉@字符之后的舊棧的存儲順序是一樣的,所以這里直接比較// { j--; //j是定義需要比較字符的大小,只要兩個棧的元素ASCLL相等j就減一,如果全部相等j為0,該字符串就是互為回文序列// } S->top--; //兩個top指針向下值// p->top--; if(j==0) //判斷// { printf("兩個字符串互為回文序列!"); } } if(j!=0) { printf("兩個字符串不互為回文序列!"); } free(p); //free掉分配的空間// } int main() { SeqStack S; char x; int m=0; Initstack(&S); printf("請輸入第一串字符\n"); while(m!=2) //因為只需要輸入兩個字符串的判斷,判斷條件為m!=2// { scanf("%c",&x); if(x=='@') //輸入@后表明第一個字符串結束// { m++; if(m==1) { printf("請輸入第二串字符:\n"); } } Push(&S,x); } Pop(&S); return 0; }
下面加一個例子:
判斷3+1與1+3是否為回文序列
關于“C語言怎么用順序棧實現回文序列判斷”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。