C資料結構-棧和佇列,括號匹配舉例---ShinePans
阿新 • • 發佈:2019-02-17
1.棧和佇列是兩種特殊的線性表
運算操作被限定只能在表的一端或兩端插入,刪除元素,故也稱它們為限定的線性表結構2.棧的基本運算
1).Stackinit(&s) 構造一個空棧 2).Stackempty(s) 判斷s是否為空棧,當s為空棧時,函式返回值1 否則 0 3).Push(&s,x) 在棧s 的頂部插入元素x,簡稱將x入 棧 4).Pop(&s,&x) 在棧s 中刪除頂元並將其值儲存在x單元中返回,簡稱將x出棧 5)Gettop(s,&x) 讀s棧中的頂元素,將其值儲存在x 單元中並返回 6)Stacklength(s) 返回棧s中元素的個數,即s的長度 7)Stackfull(s) 判定棧s 是否已滿,當s已滿時,返回值為1 否則為 0 應用, (){}[] 括號的匹配 舉例:(待完善)#include <stdio.h> #include <conio.h> #include <stdlib.h> //system(); 這個指令需要用到此標頭檔案 #include <ctype.h> //toupper要用到 #include <malloc.h> //在記憶體管理時用到的標頭檔案 #include <string.h> //字串的標頭檔案 #define MAX_SIZE 100 //定義棧初始空間的容量 typedef struct //建立結構體 { int top; int size; char *base; }STACK; void push(STACK *s, char e); //壓入元素 void pop(STACK *s, char *e); //刪除元素 void push(STACK *s, char e) { if (s->top + 1 > MAX_SIZE) //如果 此時top之前指向 100的位置,那麼就要溢位了,則例通過判斷排除溢位的情況,直接退出當前函式 return; *(s->base + s->top) = e; //base指向棧底,top指向棧頂元素的上一層空白處,將空白處填入e s->top++; //空白處填入1後,top指向下一個空白 } void pop(STACK *s, char *e) { if (s->top <= 1) return; *e = *(s->base + s->top); s->top--; //將棧頂指標 回移 } STACK stack; int result = 0; void main(int argc, char **argv) { char buf[100]; int i = 0; char temp; stack.top = 1; //資料從stack->base+stack+top 開始存 stack.size = MAX_SIZE; //為100 stack.base = (char *)malloc(sizeof(char)*stack.size);//申請記憶體空間 if (stack.base = NULL) { printf("stack = NULL RETURN"); return; } memset(stack.base, '0', sizeof(STACK)); memcpy(buf, argv[1], strlen(argv[1]));//將需要解析的字串存在buf中 buf[strlen(argv[1])] = '\0'; //'\0'來表示結束 while (buf[i] != '\0') if (buf[i] == '(') //碰到左括號 { push(&stack, buf[i]); //出現左括號,入棧 } else if (buf[i] == ')') //碰到右括號 { if (stack.top == 1) //如果棧中沒有左括號,則錯誤,result=1 { result = 1; } else if (*(stack.base + stack.top - 1) == '(');//如果棧裡有左括號 { pop(&stack, &temp); //出棧 } i++; } if (stack.top > 1) //如果括號中還有左括號,缺少右括號 result = 1; if (result == 1) printf("Wrong!"); if (result == 0) printf("Right"); }
{}[] 的原理也一樣