1. 程式人生 > >用堆疊來實現括號匹配的比較

用堆疊來實現括號匹配的比較

常常在運算表示式中用各種括號的存在,可怎麼判斷括號是否合法呢?

如[()]()  就是合法的    而(()(])就是不合法的

假設使用者先輸入([(則後面必須先檢測有無)與第三個相匹配,

再檢測有無]與第二個相匹配,再檢測有無)與第一個相匹配與堆疊後進先出的特點相匹配

我的思路如下出現一個[就向堆疊中壓入1

出現一個(就向堆疊中壓入2

而出現一個]就從堆疊中彈出一個數並檢查是否為1

出現一個)就從堆疊中彈出一個數並檢查是否為2

#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
#define SElemtype int
#define MAXINPUT 100
#define symbol1 1
#define symbol2 2
typedef struct
{
 SElemtype *top;
 SElemtype *base;
 int stacksize;
}SqStack;
typedef enum
{
 OK,
 ERROR
}Status;
int InitStack(SqStack *s)
{
 s->base=(SElemtype *)malloc(STACK_INIT_SIZE*sizeof(SElemtype));
 if(!s->base)
 return ERROR;
 s->top=s->base;
 s->stacksize=STACK_INIT_SIZE;
 return OK;
}
int Push(SqStack *s,SElemtype item)
{
 if(s->top-s->base>=s->stacksize)//如果堆疊已滿就增加空間
 {
  s->base=(SElemtype*)realloc(s->base,(s->stacksize+STACK_INCREMENT)*sizeof(SElemtype));
  if(!s->base)
  {
   return ERROR;
  }
  s->stacksize+=STACK_INCREMENT;
 }
 *s->top=item;
 s->top++;
 return OK;
}
int Pop(SqStack *s,SElemtype *item)
{
 if(s->base==s->top)//堆疊為空
 {
  return ERROR;
 }
 s->top--;
 *item=*s->top;
 return OK;
}
int Gettop(SqStack *s,SElemtype *item)
{
 if(s->base==s->top)//堆疊為空
 {
  return ERROR;
 }
 *item=*(--(s->top));
 s->top++;
 return OK;
}
int compare(char* input)
{
    SqStack s;
    InitStack(&s);
    int tmp;
    while(*input)
    {
        if(*input=='[')
        Push(&s,symbol1);
        else if(*input=='(')
        Push(&s,symbol2);
        else if(*input==']')
        {
           if(Pop(&s,&tmp)==ERROR)//如果堆疊中沒有與之對應的符號了返回錯誤
           return ERROR;
           if(tmp!=symbol1)//如果彈出的符號與當前輸入的符號不相對應的話返回錯誤
           return ERROR;
        }
        else if(*input==')')
        {
            if(Pop(&s,&tmp)==ERROR)//如果堆疊中沒有與之對應的符號了返回錯誤
            return ERROR;
            if(tmp!=symbol2)//如果彈出的符號與當前輸入的符號不相對應的話返回錯誤
               return ERROR;
        }

        input++;
    }
    if(Pop(&s,&tmp)==ERROR)
    return OK;
    else
    return ERROR;

}

int main(int argc,char *argv)
{
    char input[MAXINPUT];
    printf("Please input the symbol\n");
    gets(&input);
    if(compare(&input)==OK)
    printf("The symbol is ok\n");
    else
    printf("The symbol is error\n");
    return EXIT_SUCCESS;

}

相關推薦

堆疊實現括號匹配比較

常常在運算表示式中用各種括號的存在,可怎麼判斷括號是否合法呢? 如[()]()  就是合法的    而(()(])就是不合法的 假設使用者先輸入([(則後面必須先檢測有無)與第三個相匹配, 再檢測有無]與第二個相匹配,再檢測有無)與第一個相匹配與堆疊後進先出的特點相匹配 我

《資料結構》嚴蔚敏 實現括號匹配檢驗

思路:將符合要求的符號"[“和”(“新增到棧中,然後將每一次輸入的”]“和”)"與棧頂元素利用ascii碼值來進行比較,如果匹配則將棧中壓入的元素彈出,否則繼續匹配下一個。當輸入結束符“#”時,若棧為空,則匹配成功,否則,匹配失敗 核心程式碼: int match(char p,char

20. Valid Parentheses(實現括號匹配)

ise || character output sam char span arr NPU Given a string containing just the characters ‘(‘, ‘)‘, ‘{‘, ‘}‘, ‘[‘ and ‘]‘, determine if

Jquery實現點擊事件等的功能

點擊事件 image alt logs ima log ges query images 用Jquery來實現點擊事件等的功能

openpyxl實現99乘法表

python openpyxl openpyxl作為excel眾多的一員,具有簡單易用,功能廣泛的特點。環境: win 10 python 3.6 pip 9.0.1 openpyxl 2.4.8安裝openpyxl 打開cmd命令行,輸入pip install

[LeetCode] 232. Implement Queue using Stacks 實現隊列

logs not IT pty HA 實現 AC ted .cn Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of

js實現那些數據結構(數組篇01)

指定 賦值 重要 原始類型 delete 號稱 如果 開發 實現原理    在開始正式的內容之前,不得不說說js中的數據類型和數據結構,以及一些比較容易讓人混淆的概念。那麽為什麽要從數組說起?數組在js中是最常見的內存數據結構,數組數據結構在js中擁有很多的方法,很多初學者

232 Implement Queue using Stacks 實現隊列

whether light 操作 move bool problem rem http rip 使用棧來實現隊列的如下操作: push(x) -- 將一個元素放入隊列的尾部。pop() -- 從隊列首部移除元素。peek() -- 返回隊列首部的元素。empty() --

js實現那些數據結構10(集合02-集合的操作)

交集 學習 href targe 更改 分類 擁有 ren log   前一篇文章我們一起實現了自定義的set集合類。那麽這一篇我們來給set類增加一些操作方法。那麽在開始之前,還是有必要解釋一下集合的操作有哪些。便於我們更快速的理解代碼。   1、並集:對於給定的兩個集合

js實現那些數據結構11(字典)

完成 str function .get 自己的 items 結構 AR pre   我們這篇文章來說說Map這種數據結構如何用js來實現,其實它和集合(Set)極為類似,只不過Map是【鍵,值】的形式存儲元素,通過鍵來查詢值,Map用於保存具有映射關系的數據,Map裏保存

js實現那些數據結構14(樹02-AVL樹)

PE 有一個 解決 講解 html 16px var map 操作   在使用二叉搜索樹的時候會出現 一個問題,就是樹的一條分支會有很多層,而其他的分支卻只有幾層,就像下面這樣:   如果數據量夠大,那麽我們在某條邊上進行增刪改查的操作時,就會消耗大量的時間。我們花費精力

js實現那些數據結構15(圖01)

ice ring repeat fan lB tool ati ges lba 其實在上一篇介紹樹結構的時候,已經有了一些算法的相關內容介入。而在圖這種數據結構下,會有更多有關圖的算法,比如廣度優先搜索,深度優先搜索最短路徑算法等等。這是我們要介紹的最後一個數據結構。同時也

Vue實現音樂播放器(十六):滾動列表的實現

com 作用 efault nor 大小 -s stylus BE ack 滾動列表是一個基礎組件 他是基於scroll組件實現的 在base文件夾下面創建一個list-view文件夾 裏面有list-view.vue組件 <template>

Vue實現音樂播放器(十八):右側快速入口點擊高亮

為我 UC 沒有 short cut this 必須 左右 png 問題一:當我們點擊右側快速入口的時候 被點擊的地方高亮 首先我們要知道右側快速入口是為什麽高亮??因為當watch()監控到scrollY的變化了的時候 將scrollY的值和listHeight相比較

Vue實現音樂播放器(八):自動輪播圖啊

-s AR better hold ons ntp next start upd slider.vue組件的模板部分 <template> <div class="slider" ref="slider"> <div class=

Vue實現音樂播放器(九):歌單數據接口分析

QQ 插件 但是 之間 nbsp 跨域問題 前端 代理服務 一點 z這裏如果我們和之前獲取輪播圖的數據一樣來獲取表單的數據 發現根本獲取不到 原因是qq音樂在請求頭裏面加了authority和refer等 但是如果我們通過jsonp實現跨域

Vue實現音樂播放器(三十八):歌詞滾動列表的問題

vue 三十八 pla -s toggle 情況 TP 解決辦法 暫停 1、頻繁切換歌曲時,歌詞會跳來跳去 原因: // 歌詞跳躍是因為內部有一個currentLyric對像內部有一些功能來完成歌詞的跳躍 //每個currentLyric能實現歌曲的播放跳到相應的位置 是

Vue實現音樂播放器(四十):歌單詳情頁布局以及Vuex實現路由數據通訊

二級 font 利用 imp 實現 map color 音樂 image 1、歌單詳情頁是推薦頁面的二級路由頁面 將推薦頁面歌單的數據傳到歌曲詳情頁面 利用vuex 1、首先在state下定義一個歌單對象 disc{} 2、在mutaions

怎麼理解程式碼實現資料結構

怎麼能更好的用程式碼實現資料結構內容? 個人理解為:1.首先要掌握資料結構的邏輯,也就是說要知道資料結構是怎麼實現的。這一點達不到的話,後面根本就無從談起。                   &nbs

java實現接收感測器裡面的溫溼度、各種氣體、大氣壓

之前主要依靠公司裡面一個同事用vb編的程式,因為我不知道crc校驗是怎麼出來的,為了趕專案用了vb,然後用java 呼叫資料庫裡面的資料;但是一個專案應該統一語言的; 我需要接受如下感測器資訊 感測器(-130米主通風井) 192.168.1