所以用順序棧有可能發生上溢現象,因此在這裏我用鏈式棧來解決這個問題
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#define len sizeof(stack)
typedef struct node
{
char c;
struct node* next;
}stack,*link;
link push(link s,char c); //進棧
link pop(link s); //出棧
int main ()
{
int flag=1; //初始化為1,表示輸入的符號是匹配的
char c,top;
link s=NULL; //置空棧
while(1)
{
scanf("%c",&c);
switch(c)
{
case '[':
case '{':
case '(':
s=push(s,c);
break;
case ']':
case '}':
case ')':
top=s->c; //取得棧頂跟c比較
if((top=='['&&c==']')||(top=='{'&&c=='}')||(top=='('&&c==')')) //判斷棧頂元素是否與c相同
s=pop(s);
else
flag=0; //不想同則改變標誌flag的值
break;
}
if(!flag) //如果flag非真,則表示符號不匹配,顯示相關信息並退出,否則繼續輸入
{
printf("符號不匹配!\n");
break;
}
}
return 0;
}
link push(link s,char c)
{
link p;
p=(link)malloc(len);
//進棧操作其實用的就是不帶頭結點的頭插法建立壹個單鏈表
p->c=c;
p->next=s;
s=p; //更新棧頂
return s; //返回新棧頂
}
link pop(link s)
{
link p;
p=s; //保存原棧頂
s=s->next; //更新棧頂
free(p); //刪除原棧頂
return s;
}