XTU資料結構(C語言版)
阿新 • • 發佈:2019-01-01
表示式中的小括號可能出現不匹配的情況,使用者以字串的方式輸入一個表示式,請用棧這種結構對錶達式中小括號的匹配情況進行檢測,輸出檢測結果(匹配還是不匹配)。
#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct node { char data; struct node *next; }LStackNode,*LinkStack; void InitStack(LinkStack *top) { if((*top=(LinkStack)malloc(sizeof(LStackNode)))==NULL) exit(-1); (*top)->next=NULL; }int StackEmpty(LinkStack top) { if(top->next==NULL) return 1; else return 0; } int PushStack(LinkStack top,char e) { LStackNode *p; if((p=(LStackNode*)malloc(sizeof(LStackNode)))==NULL) { printf("記憶體分配失敗!\n"); exit(-1); } p->data=e; p->next=top->next; top->next=p; return 1; } int PopStack(LinkStack top,char *e) { LStackNode *p; p=top->next; if(!p) { printf("棧已空!\n"); return 0; } top->next=p->next; *e=p->data; free(p); return 1; } int GetTop(LinkStack top,char *e) { LStackNode *p; p=top->next; if(!p) { printf("棧已空!\n"); return 0; } *e=p->data; return 1;} int StackLength(LinkStack top) { LStackNode *p; int count=0; p=top; while(p->next!=NULL) { p=p->next; count++; } return count; } void DestroyStack(LinkStack top) { LStackNode *p,*q; p=top; while(!p) { q=p; p=p->next; free(q); } } int Match(char e,char ch) { if(e=='('&&ch==')') return 1; else return 0; }int main() { LinkStack S; char *p; char e; char ch[1024]; InitStack(&S); gets(ch); p=ch; while(*p) { switch(*p) { case'(': PushStack(S,*p++); break; case')': if(StackEmpty(S)) { printf("缺少左括號!\n"); return; } else { GetTop(S,&e); if(Match(e,*p)) PopStack(S,&e); else { printf("右左括號不匹配。\n"); return; } } default: p++; } } if(StackEmpty(S)) printf("括號匹配!\n"); else printf("缺少右括號!\n"); }