国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

練習(xí)題----順序棧算法

這篇具有很好參考價(jià)值的文章主要介紹了練習(xí)題----順序棧算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

題目:

? 輸入一個(gè)包括 '(' 和 ')' 的字符串string ,判斷字符串是否有效。要求設(shè)計(jì)算法實(shí)現(xiàn)檢查字符串是否有效,有效的字符串需滿足以下條件:

A. 左括號(hào)必須用相同類型的右括號(hào)閉合。

B. 左括號(hào)必須以正確的順序閉合。

C. 每個(gè)右括號(hào)都有一個(gè)對(duì)應(yīng)的相同類型的左括號(hào)。

題目分析:

? 該題需要滿足三個(gè)條件,左括號(hào)類型,數(shù)量,順序都得一致,所以選擇使用順序棧結(jié)構(gòu)來實(shí)現(xiàn)。

? 主要思路為遍歷兩次字符串。第一次遍歷時(shí),將遇到的左括號(hào)依次存入順序棧中;第二次遍歷時(shí),每當(dāng)遇到右括號(hào)時(shí),便執(zhí)行彈棧操作,并將彈棧出的元素與右括號(hào)類型進(jìn)行對(duì)比。若類型一致,則繼續(xù)遍歷;若類型不一致,則將此時(shí)的棧頂元素下標(biāo)加一且終止遍歷,代表該字符串無效。

? 最后通過判斷順序棧中棧頂元素下標(biāo)是否為-1,即順序棧中是否還有元素,來判定字符串是否有效。

原理圖示:

練習(xí)題----順序棧算法

代碼實(shí)現(xiàn):

/*********************************************************************
*
*	name	 :	SeqStack_JudgString
*	function : 根據(jù)用戶輸入的字符串中的括號(hào)個(gè)數(shù)與匹配度進(jìn)行判斷字符串的
				正確性
*	argument :  
*				@Manager  :順序棧的地址
*				
*	retval	 :  調(diào)用成功返回新的棧地址
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
void SeqStack_JudgString( DataType_t *str)
{
	//創(chuàng)建順序棧
	SeqStack_t *SequenceStack = SeqStack_Create(sizeof(str));

	//計(jì)算得到的字符串長(zhǎng)度
	int n = strlen(str);
	//遍歷得到的字符串,將字符串中各中類型的左括號(hào)按先后順序放入順序棧中
	for (int i = 0; i < n;i++)
	{
		if(str[i] == '(')
			SeqStack_Push(SequenceStack, str[i]);
		else if(str[i] == '[')
			SeqStack_Push(SequenceStack, str[i]);
		else if(str[i] == '{')
			SeqStack_Push(SequenceStack, str[i]);
	}



	//再次對(duì)字符串遍歷,找到對(duì)應(yīng)的右括號(hào),并且判斷類型是否相符合
	for (int i = 0; i < n; i++)
	{
		if(str[i] == ')')
		{
			DataType_t temp = SeqStack_Pop(SequenceStack);
			if('('== temp) //彈棧出的元素是相同類型的左括號(hào)時(shí),繼續(xù)遍歷
				continue;
			else
			{
				SequenceStack->Top++;
				break;
			}
		}
		else if(str[i] == ']')
		{
			DataType_t temp1 = SeqStack_Pop(SequenceStack);
			if('[' == temp1)
				continue;
			else
			{
				SequenceStack->Top++;
				break;
			}
		}
		else if(str[i] == '}')
		{
			DataType_t temp2 = SeqStack_Pop(SequenceStack);

			if('{'== temp2)
				continue;
			else
			{
				SequenceStack->Top++;
				break;
			}
		}
	}



	//判斷匹配后的左右括號(hào)數(shù)量是否一致
	if(SequenceStack->Top == -1)
		printf("The string is valid!\n");
	else
		printf("The string is invalid!\n");


	return;
}

代碼整體展示:

/*******************************************************************
 *
 *	file name:	SequenceStack_demo.c
 *	author	 :  790557054@qq.com
 *	date	 :  2024/04/25
 *	function :  該案例是利用順序棧實(shí)現(xiàn)判斷一個(gè)字符串是否有效,即通過判斷
				括號(hào)數(shù)是否能夠正確匹配得出結(jié)論
 * 	note	 :  None
 *
 *	CopyRight (c)  2023-2024   790557054@qq.com   All Right Reseverd
 *
 * *****************************************************************/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

//指的是順序棧中的元素的數(shù)據(jù)類型,用戶可以根據(jù)需要進(jìn)行修改
typedef char  DataType_t;

//構(gòu)造記錄順序棧SequenceStack各項(xiàng)參數(shù)(棧底地址+棧容量+棧頂元素的下標(biāo))的結(jié)構(gòu)體
typedef struct SequenceStack
{
	DataType_t * Bottom;		//記錄棧底地址
	unsigned int Size;			//記錄棧容量
	int			 Top;      		//記錄棧頂元素的下標(biāo)	

}SeqStack_t;
/*********************************************************************
*
*	name	 :	SeqStack_Create
*	function :  創(chuàng)建一個(gè)空的順序棧,并為記錄順序棧信息的結(jié)構(gòu)體
				申請(qǐng)堆內(nèi)存,并進(jìn)行初始化即可!
*	argument :  
*				@size  :棧的容量大小
*				
*	retval	 :  調(diào)用成功返回順序棧的地址
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
//創(chuàng)建順序表并對(duì)順序棧進(jìn)行初始化
SeqStack_t * SeqStack_Create(unsigned int size)
{
	//1.利用calloc為順序棧的管理結(jié)構(gòu)體申請(qǐng)一塊堆內(nèi)存
	SeqStack_t *Manager = (SeqStack_t *)calloc(1,sizeof(SeqStack_t));

	if(NULL == Manager)
	{
		perror("calloc memory for manager is failed");
		exit(-1); //程序異常終止
	}

	//2.利用calloc為所有元素申請(qǐng)堆內(nèi)存
	Manager->Bottom = (DataType_t *)calloc(size,sizeof(DataType_t));

	if (NULL == Manager->Bottom)
	{
		perror("calloc memory for Stack is failed");
		free(Manager);
		exit(-1); //程序異常終止
	}

	//3.對(duì)管理順序棧的結(jié)構(gòu)體進(jìn)行初始化(元素容量 + 最后元素下標(biāo))
	Manager->Size = size;	//對(duì)順序棧中的容量進(jìn)行初始化
	Manager->Top = -1;		//由于順序棧為空,則棧頂元素的下標(biāo)初值為-1
	
	return Manager;
}
/*********************************************************************
*
*	name	 :	SeqStack_IsFull
*	function : 判斷順序棧是否已滿
*	argument :  
*				@Manager  :順序棧的地址
*				
*	retval	 :  調(diào)用成功返回bool型,滿了則返回true,沒滿返回false
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
bool SeqStack_IsFull(SeqStack_t *Manager)
{
	return (Manager->Top + 1 == Manager->Size) ? true : false;
}
/*********************************************************************
*
*	name	 :	SeqStack_Push
*	function : 根據(jù)棧的特性,把新元素從棧頂入棧,也就是從數(shù)組的尾部進(jìn)行元素插入
*	argument :  
*				@Manager  :順序棧的地址
				@Date  	  :要入棧的數(shù)據(jù)
*				
*	retval	 :  調(diào)用成功返回bool型,滿了則返回true,沒滿返回false
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
//入棧
bool SeqStack_Push(SeqStack_t *Manager, DataType_t Data)
{
	//1.判斷順序棧是否已滿
	if ( SeqStack_IsFull(Manager) )
	{
		printf("SeqStack Full is Full!\n");
		return false;
	}

	//2.如果順序棧有空閑空間,則把新元素添加到順序棧的棧頂
	Manager->Bottom[++Manager->Top] = Data;

	return true;
}

/*********************************************************************
*
*	name	 :	SeqStack_IsEmpty
*	function : 	判斷順序棧是否為空
*	argument :  
*				@Manager  :順序棧的地址
*				
*	retval	 :  調(diào)用成功返回bool型,空了則返回true,沒空返回false
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
bool SeqStack_IsEmpty(SeqStack_t *Manager)
{
	return (-1 == Manager->Top) ? true : false;
}
/*********************************************************************
*
*	name	 :	SeqStack_Pop
*	function : 根據(jù)棧的特性,把元素從棧頂出棧,也就是把元素從數(shù)組的尾部把元素刪除
*	argument :  
*				@Manager  :順序棧的地址
*				
*	retval	 :  調(diào)用成功返回新的棧地址
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
//出棧
DataType_t SeqStack_Pop(SeqStack_t *Manager)
{
	DataType_t temp = 0;  //用于存儲(chǔ)出棧元素的值

	//1.判斷順序棧是否為空
	if ( SeqStack_IsEmpty(Manager) )
	{
		// printf("SeqStack is Empty!\n");
		return -1;
	}
	
	//2.由于刪除了一個(gè)元素,則需要讓順序棧的棧頂元素下標(biāo)-1
	temp = Manager->Bottom[Manager->Top--];

	return temp;
}

/*********************************************************************
*
*	name	 :	SeqStack_JudgString
*	function : 根據(jù)用戶輸入的字符串中的括號(hào)個(gè)數(shù)與匹配度進(jìn)行判斷字符串的
				正確性
*	argument :  
*				@Manager  :順序棧的地址
*				
*	retval	 :  調(diào)用成功返回新的棧地址
*	author	 :  790557054@qq.com
*	date	 :  2024/04/25
* 	note	 :  none
* 	
* *****************************************************************/
void SeqStack_JudgString( DataType_t *str)
{
	//創(chuàng)建順序棧
	SeqStack_t *SequenceStack = SeqStack_Create(sizeof(str));

	//計(jì)算得到的字符串長(zhǎng)度
	int n = strlen(str);
	//遍歷得到的字符串,將字符串中各中類型的左括號(hào)按先后順序放入順序棧中
	for (int i = 0; i < n;i++)
	{
		if(str[i] == '(')
			SeqStack_Push(SequenceStack, str[i]);
		else if(str[i] == '[')
			SeqStack_Push(SequenceStack, str[i]);
		else if(str[i] == '{')
			SeqStack_Push(SequenceStack, str[i]);
	}



	//再次對(duì)字符串遍歷,找到對(duì)應(yīng)的右括號(hào),并且判斷類型是否相符合
	for (int i = 0; i < n; i++)
	{
		if(str[i] == ')')
		{
			DataType_t temp = SeqStack_Pop(SequenceStack);
			if('('== temp) //彈棧出的元素是相同類型的左括號(hào)時(shí),繼續(xù)遍歷
				continue;
			else
			{
				SequenceStack->Top++;
				break;
			}
		}
		else if(str[i] == ']')
		{
			DataType_t temp1 = SeqStack_Pop(SequenceStack);
			if('[' == temp1)
				continue;
			else
			{
				SequenceStack->Top++;
				break;
			}
		}
		else if(str[i] == '}')
		{
			DataType_t temp2 = SeqStack_Pop(SequenceStack);

			if('{'== temp2)
				continue;
			else
			{
				SequenceStack->Top++;
				break;
			}
		}
	}



	//判斷匹配后的左右括號(hào)數(shù)量是否一致
	if(SequenceStack->Top == -1)
		printf("The string is valid!\n");
	else
		printf("The string is invalid!\n");


	return;
}

int main(int argc, char const *argv[])
{

	while(1)
	{
	//定義一個(gè)字符串指針變量 用于存儲(chǔ)用戶輸入的字符串
	DataType_t  str[200];
	printf("Please input a string containing parentheses :\n ");
	scanf("%s", str);
	SeqStack_JudgString( str);
	}



	return 0;
}

結(jié)果驗(yàn)證:

練習(xí)題----順序棧算法

待優(yōu)化問題:

  • 如果右括號(hào)在最前面時(shí),應(yīng)該判斷是無效,但是目前算法無法判斷,例如:)(1+2 該算法會(huì)判斷有效 是錯(cuò)誤判斷

優(yōu)化思路:

? 將判斷’(‘和 ’)‘的判斷放進(jìn)一個(gè)循環(huán)里面判斷,這樣比兩次遍歷的時(shí)間復(fù)雜度更低,需要吸取教訓(xùn),優(yōu)化自身解題思路,思考更多樣的情況。

圖示:

練習(xí)題----順序棧算法文章來源地址http://www.zghlxwxcb.cn/news/detail-858648.html

到了這里,關(guān)于練習(xí)題----順序棧算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】順序表詳解(附leetcode練習(xí)題)

    【數(shù)據(jù)結(jié)構(gòu)】順序表詳解(附leetcode練習(xí)題)

    ??個(gè)人主頁:fighting小澤 ??作者簡(jiǎn)介:目前正在學(xué)習(xí)C語言和數(shù)據(jù)結(jié)構(gòu) ??博客專欄:數(shù)據(jù)結(jié)構(gòu) ???歡迎關(guān)注:評(píng)論????點(diǎn)贊????留言???? 線性表(linear list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。 線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),常見的線性表:順

    2023年04月27日
    瀏覽(23)
  • 10 SQL進(jìn)階 -- 綜合練習(xí)題 -- 10道經(jīng)典SQL題目,配套數(shù)據(jù)與解答

    10 SQL進(jìn)階 -- 綜合練習(xí)題 -- 10道經(jīng)典SQL題目,配套數(shù)據(jù)與解答

    點(diǎn)擊下方鏈接直接下載 創(chuàng)建數(shù)據(jù)表腳本:http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/create_table.sql 執(zhí)行建表語句 執(zhí)行成功 查看創(chuàng)建的表 點(diǎn)擊下方鏈接直接下載 插入數(shù)據(jù)腳本:https://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/data.zip 大家下載好腳本后,先在MySQL環(huán)境中運(yùn)

    2024年04月27日
    瀏覽(21)
  • JAVA面向?qū)ο缶毩?xí)題,課后編程題。題目為:公司員工分為5類,每類員工都有相應(yīng)的封裝類。

    某公司的員工分為5類,每類員工都有相應(yīng)的封裝類,這5個(gè)類的信息如下 (1)Employee:這是所有員工的父類。 ①屬性:?jiǎn)T工的姓名、員工的生日月份。 )方法:getSalary(int?month)根據(jù)參數(shù)月份確定工資。如果該月員工過生日,則公司會(huì)額外發(fā)放100元。 (2)SalariedEmployee:Employee?

    2024年02月05日
    瀏覽(27)
  • 【UML】-- 順序圖練習(xí)題含答案(自動(dòng)售貨機(jī)、學(xué)生選課、提款機(jī)、購買地鐵票、洗衣機(jī)工作)

    【UML】-- 順序圖練習(xí)題含答案(自動(dòng)售貨機(jī)、學(xué)生選課、提款機(jī)、購買地鐵票、洗衣機(jī)工作)

    根據(jù)下面的敘述,繪制一幅關(guān)于顧客從自動(dòng)售貨機(jī)中購買物品的順序圖。 顧客( User )先向自動(dòng)售貨機(jī)的前端( Front )投幣; 售貨機(jī)的識(shí)別器( Register )識(shí)別錢幣; 售貨機(jī)前端( Front )根據(jù) Register 的識(shí)別結(jié)果產(chǎn)生商品列表; 顧客選擇商品; 前端控制的出貨器( Dispense

    2023年04月18日
    瀏覽(84)
  • <算法學(xué)習(xí)>動(dòng)態(tài)規(guī)劃練習(xí)題

    <算法學(xué)習(xí)>動(dòng)態(tài)規(guī)劃練習(xí)題

    本篇文章為初學(xué)動(dòng)態(tài)規(guī)劃時(shí)的練習(xí)題。參考優(yōu)質(zhì)博客學(xué)習(xí)后根據(jù)偽代碼描述完成代碼。記錄一下用于以后復(fù)習(xí)。 給定一個(gè)有n行數(shù)字組成的數(shù)字三角形. 試設(shè)計(jì)一個(gè)算法, 計(jì)算出從三角形的頂至底的一條路徑, 使該路徑經(jīng)過的數(shù)字和最大. 算法設(shè)計(jì): 對(duì)于給定的n行數(shù)字組成的三角

    2024年01月17日
    瀏覽(18)
  • Matlab:遺傳算法,模擬退火算法練習(xí)題

    Matlab:遺傳算法,模擬退火算法練習(xí)題

    1、遺傳算法 (1) 遺傳算法 是一種基于自然選擇原理和自然遺傳機(jī) 制的搜索(尋優(yōu))算法,它是模擬自然界中的生命進(jìn)化機(jī)制,在人工系統(tǒng)中實(shí)現(xiàn)特定目 標(biāo)的優(yōu)化。遺傳算法的實(shí)質(zhì)是通過群體搜索技術(shù),根據(jù)適者生存的原則逐代進(jìn)化,最終 得到最優(yōu)解或準(zhǔn)最優(yōu)解。它必須

    2024年01月21日
    瀏覽(29)
  • 拓?fù)渑判?(算法思想+圖解+模板+練習(xí)題)

    拓?fù)渑判?(算法思想+圖解+模板+練習(xí)題)

    有向無環(huán)圖一定是拓?fù)湫蛄?有向有環(huán)圖一定不是拓?fù)湫蛄小?無向圖沒有拓?fù)湫蛄小?首先我們先來解釋一下什么是有向無環(huán)圖: 有向就是我們兩個(gè)結(jié)點(diǎn)之間的邊是有方向的,無環(huán)的意思就是整個(gè)序列中沒有幾個(gè)結(jié)點(diǎn)通過邊形成一個(gè)圓環(huán)。 下圖就是一個(gè)有向無環(huán)圖,它也一定

    2024年02月03日
    瀏覽(27)
  • 【算法設(shè)計(jì)與分析】動(dòng)態(tài)規(guī)劃-練習(xí)題

    【算法設(shè)計(jì)與分析】動(dòng)態(tài)規(guī)劃-練習(xí)題

    輸入一個(gè)整數(shù)數(shù)組 S[n] ,計(jì)算其最長(zhǎng)遞增子序列的長(zhǎng)度,及其最長(zhǎng)遞增子序列。 定義 k ( 1 ≤ k ≤ n ) k (1 ≤ k ≤ n) k ( 1 ≤ k ≤ n ) ,L[k]表示以 S[k] 結(jié)尾的遞增子序列的最大長(zhǎng)度。子問題即為 L[k]。 對(duì)于每一個(gè)k,我們都遍歷前面0~k-1的所有的數(shù),找出最大的L[i],且 S [ k ] L [

    2024年02月03日
    瀏覽(28)
  • 數(shù)據(jù)結(jié)構(gòu)與算法系列之習(xí)題練習(xí)

    數(shù)據(jù)結(jié)構(gòu)與算法系列之習(xí)題練習(xí)

    ?? ?? 博客:小怡同學(xué) ?? ?? 個(gè)人簡(jiǎn)介:編程小萌新 ?? ?? 如果博客對(duì)大家有用的話,請(qǐng)點(diǎn)贊關(guān)注再收藏 ?? 括號(hào)匹配問題。 用隊(duì)列實(shí)現(xiàn)棧。 用棧實(shí)現(xiàn)隊(duì)列。 設(shè)計(jì)循環(huán)隊(duì)列。 有效的括號(hào) //用棧來實(shí)現(xiàn) //左括號(hào)進(jìn)棧 右括號(hào)出棧并銷毀如果不匹配則return //設(shè)置兩個(gè)隊(duì)列,入棧

    2024年02月11日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)與算法--圖(概念+練習(xí)題+解析)

    數(shù)據(jù)結(jié)構(gòu)與算法--圖(概念+練習(xí)題+解析)

    有向圖 在有向圖中有以下幾點(diǎn)結(jié)論: 1.所有頂點(diǎn)的度數(shù)之和等于邊數(shù)的二倍。 2.所有頂點(diǎn)的入度之和等于出度之和。 3.n個(gè)頂點(diǎn)的有向完全圖有n(n-1)條邊。 4.n個(gè)頂點(diǎn)的強(qiáng)連通圖至少有n條邊。 無向圖 在無向圖中有以下幾點(diǎn)結(jié)論: 1.所有頂點(diǎn)的度數(shù)之和等于邊數(shù)的二倍。 2.n個(gè)頂

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包