棧的應用-----1. 就近匹配

 

敘述: 幾乎全部的編譯器都具備檢測括號匹配的能力node

如何實現編譯器中的符號檢測?ios

#include  <stdio.h> int main () {int a[4][4]; int (*p)[4]; p=a[4]; return 0;}算法

算法思路:spa

  • 從第一個字符開始掃描;
  • 當遇到普通字符時忽略;
  • 當碰見左括號時壓入棧中,
  • 當碰見右符號時,從棧中彈出棧頂符號,並進行匹配。
  •    匹配成功:繼續讀入下一個字符;匹配失敗:當即中止,並報錯。
  • 結束:
  •       成功:全部字符掃描完畢,且棧爲空;
  •       失敗:匹配失敗或全部自負掃描完畢且棧非空。

1) 代碼code

 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef struct StackNode
  5 {
  6 int data;
  7 struct StackNode *next;
  8 }StackNode,*LinkStackPtr;
  9 
 10 typedef struct LinkStack
 11 {
 12 LinkStackPtr top;
 13 int count;
 14 }LinkStack;
 15 
 16 //1. 初始化
 17 LinkStack* init_linkStack()
 18 {
 19     LinkStack *s2=(LinkStack*)malloc(sizeof(LinkStack));
 20     s2->top=NULL;
 21     s2->count=0;
 22     return s2;
 23 }
 24 
 25 //2. 入棧
 26 int push_linkStack(LinkStack*s2,int e)
 27 {
 28 LinkStackPtr node=(LinkStackPtr )malloc(sizeof(StackNode));
 29 node->data=e;
 30 node->next=s2->top;
 31 s2->top=node;
 32 //cout<<s2->count;
 33 s2->count++;
 34 
 35 return 0;
 36 }
 37 
 38 //3. 出棧
 39 int pop_linkStack(LinkStack*s2)
 40 {
 41 LinkStackPtr node=NULL;
 42 //cout<<s2->top;
 43 //cout<<s2->count;
 44 if(s2->count==0)
 45 return -1;
 46 int a=s2->top->data;
 47 s2->top=s2->top->next;
 48 s2->count--;
 49 
 50 
 51 
 52 return a;
 53 }
 54 
 55 //4. 遍歷
 56 int print_linkStack(LinkStack*s2)
 57 {
 58 LinkStack *ss=s2;
 59 LinkStackPtr node=ss->top;
 60 int k=ss->count;
 61 while(k>0)
 62 {
 63 printf(" %5d",s2->top->data);
 64 ss->top=ss->top->next;
 65 k--;
 66 }
 67 return 0;
 68 }
 69 
 70 
 71 #include <iostream>
 72 using namespace std;
 73 
 74 int isLeft(char c)
 75 {
 76     int ret =0;
 77     switch(c)
 78     {
 79         case '<':
 80         case '{':
 81         case '[':
 82         case '(':
 83         case '\'':  // 單引號
 84         case '\"': // 雙引號
 85             ret=1;
 86             break;
 87         default:
 88             ret=0;
 89             break;
 90     }
 91     return ret;
 92 }
 93 
 94 int isRight(char c)
 95 {
 96     int ret =0;
 97     switch(c)
 98     {
 99     case '>':
100     case '}':
101     case ']':
102     case ')':
103     case '\'':  // 單引號
104     case '\"': // 雙引號
105         ret=1;
106         break;
107     default:
108         ret=0;
109         break;
110     }
111     return ret;
112 }
113 
114 int match(char left,char right)
115 {
116     int ret=0;
117 
118     switch (left)
119     {
120     case '<':
121         ret=(right=='>');
122         break;
123     case '[':
124         ret=(right==']');
125         break;
126     case '(':
127         ret=(right==')');
128         break;
129     case '{':
130         ret=(right=='}');
131         break;
132     case '\'':
133         ret=(right=='\'');
134         break;
135     case '\"':
136         ret=(right=='\"');
137         break;
138     default:
139         ret=0;
140         break;
141     }
142     return ret;
143 }
144 
145 int scanner(const char *code)
146 {
147     LinkStack *s2;
148     s2=init_linkStack();
149     int ret=0;
150     int i=0;
151 
152     while (code[i]!='\0')
153     {
154         if (isLeft(code[i]))
155         {
156             //int a=atoi(code[i]);
157             //char c=code[i];
158             ret=push_linkStack(s2,code[i]);
159         }
160         if (isRight(code[i]))
161         {
162                 //int a=atoi(code[i]);
163                 //char c=code[i];
164                 char c=(char)pop_linkStack(s2);
165         
166             if(!match(c,code[i]))
167             {
168                 printf("%5c does not match!\n",code[i]);
169                 ret=0;
170                 break;
171             }
172         }
173         //cout<<code[i];
174             i++;
175             //cout<<endl<<"i的大小: "<<i;
176     }
177     //cout<<endl<<"i的大小: "<<i;
178         //cout<<char(s2->top->data);
179         //cout<<s2->count;
180         //char a=code[i-1];
181         //cout<< a;
182         if (s2->count==0)
183         {
184             printf("succeed\n");
185         }
186         else
187         {
188             printf("Invalid code\n");
189         }
190     
191 
192     return 0;
193 }
194 
195 int main()
196 {
197     const char *code="#include  <stdio.h> int main () {int a[4][4]; int (*p)[4]; p=a[4; return 0;aaaa";
198     //const char *code="(1+1;)";
199     //const char *code="(11;";
200 
201     scanner(code);
202 
203     system("pause");
204     return 0;
205 }

 

2) 運行結果blog

相關文章
相關標籤/搜索