亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么用順序棧實現回文序列判斷

發布時間:2021-10-15 17:27:25 來源:億速云 閱讀:262 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關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語言怎么用順序棧實現回文序列判斷

關于“C語言怎么用順序棧實現回文序列判斷”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武义县| 麻栗坡县| 紫阳县| 湖州市| 青阳县| 额尔古纳市| 永顺县| 灵寿县| 白城市| 崇州市| 洪江市| 鲁山县| 进贤县| 正蓝旗| 华亭县| 文山县| 通渭县| 太谷县| 镇原县| 沁阳市| 东台市| 虎林市| 尼玛县| 宿州市| 鄯善县| 德化县| 宣汉县| 金秀| 鹿邑县| 英德市| 甘肃省| 平湖市| 揭阳市| 罗甸县| 隆德县| 北宁市| 嘉义县| 岳普湖县| 葫芦岛市| 正蓝旗| 海淀区|