Lint-code-有效的括号序列

本文介绍了一种使用栈数据结构来验证括号序列有效性的算法。通过遍历字符串中的每个字符,判断其是否为合法的括号组合。该算法适用于括号匹配问题,并提供了完整的Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个字符串所表示的括号序列,包含以下字符: '(', ')''{''}''[' and ']', 判定是否是有效的括号序列。

样例

括号必须依照 "()" 顺序表示, "()[]{}" 是有效的括号,但 "([)]"则是无效的括号。

此题主要的思想是用栈来作为存储数据结构,我们将')'、‘}’、‘]’视为右括号,当遇到右括号时查看当前栈顶是否为与之对应的左括号,如果是,则将栈顶元素弹出,继续对比,如果不是与之对应的左括号,则退出返回false。

代码如下:

 public static boolean isValidParentheses(String s) {
        if(s == null || s.length() == 0 || s.length()%2!=0){
            return false;
        }
        Stack<Character> stack = new Stack<Character>();
        boolean flag = true;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i) =='(' || s.charAt(i) == '{' || s.charAt(i) == '['){
                stack.push(s.charAt(i));
            }else if(s.charAt(i) == ')'){
                if(!stack.empty() && stack.peek() == '('){
                    stack.pop();
                }else{
                    flag = false;
                     break;
                }
               
            }else if(s.charAt(i) == '}'){
                if(!stack.empty() && stack.peek() == '{'){
                    stack.pop();
                }else{
                    flag = false;
                       break;
                }
               
            }else if(s.charAt(i) == ']'){
                if(!stack.empty() && stack.peek() == '['){
                     stack.pop();
                }else{
                    flag = false;
                        break;
                }
            }
        }
        if(!stack.empty()){
            flag = false;
        }
        return flag;
    }


/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define SCL_H HAL_GPIO_WritePin(SCL_GPIO_Port,SCL_Pin,GPIO_PIN_SET); #define SCL_L HAL_GPIO_WritePin(SCL_GPIO_Port,SCL_Pin,GPIO_PIN_RESET); #define SDA_H HAL_GPIO_WritePin(SDA_GPIO_Port,SDA_Pin,GPIO_PIN_SET); #define SDA_L HAL_GPIO_WritePin(SDA_GPIO_Port,SDA_Pin,GPIO_PIN_RESET); #define SDA_R HAL_GPIO_ReadPin(SDA_GPIO_Port,SDA_Pin) #define IIC_DELAY HAL_Delay(1); #define OLED_CMD 0 #define OLED_DATA 1 #define LCD_ADDR 0x78 #define CMD_WRITE 0x00 #define DATA_WRITE 0x40 /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ void iicack() { SDA_L SCL_H IIC_DELAY SCL_L SDA_H } void iicwaitack(void) { SDA_H IIC_DELAY SCL_H IIC_DELAY SCL_L IIC_DELAY } //start void iicstart() { SDA_H SCL_H IIC_DELAY SDA_L IIC_DELAY SDA_L IIC_DELAY } //stop void iicstop() { SDA_L SCL_H IIC_DELAY SDA_H IIC_DELAY } //fashuju void iicfashuju(uint8_t byte) { for(int i=0;i<8;i++) { if(byte & 0x80) { SDA_H } else { SDA_L } SCL_H IIC_DELAY; SCL_L byte <<=1; } iicwaitack(); } //dushuju uint8_t iccdushuju() { uint8_t i,byte = 0; for(i=0;i<8;i++) { byte<<=1; SCL_H if(SDA_R) { byte|=0x01; } IIC_DELAY SCL_L } return byte; } void oled_wr_byte(uint8_t dat,uint8_t mode) { iicstart(); iicfashuju(0x78); iicwaitack(); if(mode) { iicfashuju(0x40); }else{ iicfashuju(0x00); } iicwaitack(); iicfashuju(dat); iicwaitack(); iicstop(); } void OLDE_lint(void) { oled_wr_byte(0XAE,OLED_CMD); oled_wr_byte(0X00,OLED_CMD); oled_wr_byte(0X10,OLED_CMD); oled_wr_byte(0X40,OLED_CMD); oled_wr_byte(0X81,OLED_CMD); oled_wr_byte(0XCF,OLED_CMD); oled_wr_byte(0XA1,OLED_CMD); oled_wr_byte(0XC8,OLED_CMD); oled_wr_byte(0XA6,OLED_CMD); oled_wr_byte(0XA8,OLED_CMD); oled_wr_byte(0X3F,OLED_CMD); oled_wr_byte(0XD3,OLED_CMD); oled_wr_byte(0X00,OLED_CMD); oled_wr_byte(0XD5,OLED_CMD); oled_wr_byte(0X80,OLED_CMD); oled_wr_byte(0XD9,OLED_CMD); oled_wr_byte(0XF1,OLED_CMD); oled_wr_byte(0XDA,OLED_CMD); oled_wr_byte(0X12,OLED_CMD); oled_wr_byte(0XDB,OLED_CMD); oled_wr_byte(0X30,OLED_CMD); oled_wr_byte(0X20,OLED_CMD); oled_wr_byte(0X02,OLED_CMD); oled_wr_byte(0X8D,OLED_CMD); oled_wr_byte(0X14,OLED_CMD); oled_wr_byte(0XAF,OLED_CMD); } void LCD_Write_Cmd(uint8_t cmd) { iicstart(); iicfashuju(LCD_ADDR); iicfashuju(cmd); iicstop(); } // ???? void LCD_Write_Data(uint8_t data) { iicstart(); iicfashuju(LCD_ADDR); iicfashuju(DATA_WRITE); iicfashuju(data); iicstop(); } void LCD_Init() { HAL_Delay(50); LCD_Write_Cmd(0xE2); HAL_Delay(10); LCD_Write_Cmd(0xA2); LCD_Write_Cmd(0x89); LCD_Write_Cmd(0xC0); LCD_Write_Cmd(0x2F); LCD_Write_Cmd(0xF8); LCD_Write_Cmd(0x00); LCD_Write_Cmd(0x27); LCD_Write_Cmd(0x5C); LCD_Write_Cmd(0xAC); LCD_Write_Cmd(0x01); LCD_Write_Cmd(0xAF); HAL_Delay(100); } /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ // HAL_Init(); // SystemClock_Config(); // MX_GPIO_Init(); // LCD_Init(); OLDE_lint(); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ // iicstart(); // iicfashuju(0X78); // iicfashuju(0X40); // iicfashuju(0XAF); // //iicfashuju(0XA5); // iicstop(); // // oled_wr_byte(0XAF,OLED_CMD); HAL_Delay(100); } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 72; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */
最新发布
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值