括號匹配問題(c語言實現)


一、前言

用棧實現括號匹配

依次掃描所有字符,遇到左括號入棧,遇到右括號則彈出棧頂元素檢查是否匹配。

匹配失敗的情況:

  • 左括號單身
  • 右括號單身
  • 左右括號不匹配

二、例題

給定一個只包括 '('')''{''}''['']' 的字符串 s ,判斷字符串是否有效。

有效字符串需滿足:

1.左括號必須用相同類型的右括號閉合。
2.左括號必須以正確的順序閉合。

示例1:

輸入:s = "()"
輸出:true

示例 2:

輸入:s = "()[]{}"
輸出:true

示例 3:

輸入:s = "(]"
輸出:false

示例 4:

輸入:s = "([)]"
輸出:false

示例 5:

輸入:s = "{[]}"
輸出:true

提示:

  • 1 <= s.length <= 104
  • s 僅由括號 '()[]{}' 組成

代碼:

#include<stdio.h>
#define maxSize 10000
/*棧的結構體定義*/
typedef struct
{
	char data[maxSize];
	int top;
}SqStack;

/*初始化棧*/
void initStack(SqStack& s)
{
	s.top = -1;
}
/*返回棧頂元素*/
int getElem(SqStack s, char& ch)
{
	if (s.top == -1)//棧為空
	{
		return 0;
	}
	ch = s.data[s.top];
	return 1;
}
/*判空*/
int isEmpty(SqStack s)
{
	if (s.top == -1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
/*入棧*/
int Push(SqStack& s,char x)
{
	if (s.top == maxSize - 1)//判斷棧滿
	{
		return 0;
	}
	++s.top;
	s.data[s.top] = x;
	return 1;
}
/*出棧*/
int Pop(SqStack& s)
{
	if (s.top == -1)//判斷棧空
	{
		return 0;
	}
	--s.top;
	return 1;
}
int main()
{
	SqStack st;
	initStack(st);
	char s[10000],ch;
	scanf("%s", s);
	int i = 0;
	while (s[i])
	{
		if (s[i] == '\'' || s[i] == '\'' || s[i] == '\"' || s[i] == '\"')
		{
			i++;
		}
		else
		{
			if (s[i] == '('||s[i]=='{'||s[i]=='[')
			{
				Push(st, s[i]);
			}
			else if (s[i] == ')')
			{
				getElem(st, ch);
				if (ch == '(')
				{
					Pop(st);
				}
				else
				{
					break;
				}
			}
			else if (s[i] == ']')
			{
				getElem(st, ch);
				if (ch == '[')
				{
					Pop(st);
				}
				else
				{
					break;
				}
			}
			else if (s[i] == '}')
			{
				getElem(st, ch);
				if (ch == '{')
				{
					Pop(st);
				}
				else
				{
					break;
				}
			}
		}
		i++;
	}
	if (isEmpty(st))
	{
		printf("true");
	}
	else
	{
		printf("false");
	}
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM