---
# System prepended metadata

title: 20. Valid Parentheses 筆記
tags: [LeetCode]

---

# 20. Valid Parentheses 筆記

這題是經典的推疊題目，以下先介紹簡單的堆疊。

## Stack(堆疊)

我們在資料結構中一定學過stack，其中可能有先進先出、後進先出等方法，透過下圖可以很簡單的了解到

![](https://i.imgur.com/9TWk8mJ.png)

上圖就是後進先出的例子，那以下透過程式來實現這方法
```c=
#include <stdio.h>
#include <stdlib.h>
#define MAXSTACK 100 /*定義最大堆疊容量*/
int stack[MAXSTACK];  //堆疊的陣列宣告 
int top=-1;		//堆疊的頂端
int isEmpty();
void push(int); 
int pop();
 
int main(int argc, char *argv[]) {
	int value;
	int i;
	printf("請依序輸入10筆資料:\n");
	for(i=0;i<10;i++){
		scanf("%d",&value);
		push(value);
	}
	printf("====================\n");
	while(!isEmpty()){
		printf("堆疊彈出的順序為:%d\n",pop()); 
	}
	pop();
	return 0;
}
/*判斷是否為空堆疊*/
int isEmpty(){
	if(top==-1){
		return 1; 
	}else{
		return 0;
	}
} 
/*將指定的資料存入堆疊*/
void push(int data){
	if(top>=MAXSTACK){
		printf("堆疊已滿,無法再加入\n");	
	}else{
		top++;
		stack[top]=data;
	}
 
} 
/*從堆疊取出資料*/
int pop(){
	int data;
	if(isEmpty()){
		printf("堆疊已空\n");
	}else{
		data=stack[top];
		top--;
		return data; 
	}
}
```

## 題目

在C語言中沒有堆疊相關程式，在Cpp中有支援，那在這邊就直接用模擬的方式利用top計數器來表示目前堆疊的位置，來比對是否()[]{}有對應到，第一個(進去之後top就+1，後面的比對就看看右括號是否剛好有對應，有對應到就把計數器降回去，這樣就可以一直對應順序了，這邊非常漂亮的實作了Stack。

寫了這題才發現自己有多麼不熟悉實作。

```c=
bool isValid(char * s){
    char *stack = (char *)malloc((int)s*sizeof(char));
    if(strlen(s)==0)return true;
    if(strlen(s)%2==1)return false;
    int top = 0;
    for(int i = 0; i < strlen(s); i++){
        if(s[i]=='[' || s[i]=='{' || s[i]=='('){
            stack[top] = s[i];
            top++;
        }
        else if(s[i] == ')'){
            if(top==0)
                return false;
            else if(stack[top-1] == '('){
                top--;
            }
            else{
                return false;
            }
        }
        else if(s[i] == ']'){
            if(top==0)
                return false;
            else if(stack[top-1] == '['){
                top--;
            }
            else{
                return false;
            }
        }
        else if(s[i] == '}'){
            if(top == 0)
                return false;
            else if(stack[top-1] == '{'){
                top--;
            }
            else{
                return false;
            }
        }
        else{
            return false;
        }
        }
        return top==0 ? true : false;
}
```
###### tags: `LeetCode`