資料結構作業 棧 實現 括號匹配 問題
阿新 • • 發佈:2018-12-26
資料結構作業 棧 實現 括號匹配 問題
畢竟太菜 照著demo敲了幾天才 搞定。
棧的幾個基本應用函式順便敲了 其他的就不詳說了.
見程式碼:
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define BUFFERSIZE 200 typedef int Status; //函式返回狀態 typedef char SElemType; //棧元素型別 typedef struct{//棧結構定義 SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack *S) { //構造一個空棧S S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S->base)//分配失敗 { printf("分配記憶體失敗.\n"); return 0; } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { //銷燬棧S,S不再存在 if(!S)//S為空 { printf("指標為空,釋放失敗.\n"); exit(0); } free(S); return OK; } Status ClearStack(SqStack *S) { //把棧S置為空棧 if(!S)//S不存在 return FALSE; S->top=S->base;//直接將棧頂指標指向棧底 return OK; } Status StackEmpty(SqStack S) { //若棧S為空棧,則返回TRUE,否則返回FALSE if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S) { //返回S元素的個數,即棧的長度 return S.stacksize; } Status GetTop(SqStack S,SElemType *e) { //若棧不為空,則用e返回S的棧頂元素,並返回OK;否則返回FALSE if(S.top==S.base) { return FALSE; } else { *e=*(S.top-1); return OK; } } Status Push(SqStack *S,SElemType e) { //插入元素e為新的棧頂元素 if(S->top-S->base>=S->stacksize)//棧已滿,追加儲存空間 { S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->base) { printf("重新申請空間失敗.\n"); exit(0); } S->top=S->base+S->stacksize;//更改棧頂指標 S->stacksize+=STACKINCREMENT; } *S->top++=e; return OK; } Status Pop(SqStack *S,SElemType *e) { //若棧S不為空,則刪除S的棧頂元素,用e返回其值,並返回OK,否則返回ERROR if(S->top==S->base)//棧為空 { printf("棧為空.\n"); return ERROR; } *e=*(--S->top); return OK; } Status StackTraverse(const SqStack *S){ //從棧底到棧頂依次對每個元素進行訪問 SElemType *p=S->base; if(S->base==S->top) { printf("棧為空.\n"); return FALSE; } while(p!=S->top) { printf("%c",*p++); } printf("\n"); return OK; } Status BracketMatch(SqStack *S,const char *string){ //輸入字串string中的括號匹配,返回TRUE;否則返回FALSE const char *p=string; SElemType e; InitStack(S); while(*p!='\0')//遍歷字串 { switch(*p)//判斷p的值 { case '('://左括號,入棧 case '[': case '{': Push(S,*p); break; case ')': if(FALSE==GetTop(*S,&e)) return FALSE; if(e=='(') { if(ERROR==Pop(S,&e)) return FALSE; } else return FALSE; break; case ']': if(FALSE==GetTop(*S,&e)) return FALSE; if(e=='[') { if(ERROR==Pop(S,&e)) return FALSE; } else return FALSE; break; case '}': if(FALSE==GetTop(*S,&e)) return FALSE; if(e=='{') { if(ERROR==Pop(S,&e)) return FALSE; } else return FALSE; break; default: ; } p++; } if(!StackEmpty(*S)) //字串遍歷完,棧非空,不匹配 return FALSE; return TRUE; } int main() { char *String; SqStack stack; String=(char*)malloc(sizeof(char)*BUFFERSIZE); if(!String) { printf("分配記憶體失敗.\n"); return 0; } while(1) { printf("請輸入一行含括號的表示式(輸入\"!\"退出):"); gets(String); if(String[0]=='!')//退出 break; if(TRUE==BracketMatch(&stack,String)) { printf("\n能正確匹配.\n\n"); } else { printf("\n不能正確匹配.\n\n"); } } return 0; }