棧——棧的實現和應用
阿新 • • 發佈:2019-01-03
1、採用嚴版資料結構書上第46頁定義的棧的順序儲存表示,程式設計實現棧的下列基本操作。
(1)初始化順序棧(2)建立順序棧(3)判斷棧空(4)輸出順序棧
(5)取棧頂元素(6)入棧(7)出棧
#include<stdio.h> #include<iostream> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int Status; typedef int SElemType; using namespace std; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S) { S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status StackEmpty(SqStack &S) { if (S.top == S.base) { return TRUE; } else return FALSE; } Status GetTop(SqStack &S, SElemType &e) { if (S.top == S.base) return ERROR; e= *(S.top-1); return OK; } Status Push(SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize) { S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status Pop(SqStack &S, SElemType &e) { if (S.top == S.base) return ERROR; e = *--S.top; return OK; } Status Stackoutput(SqStack &S) { SElemType *p; if (S.top == S.base) return ERROR; p = S.base; while (p != S.top) { printf("%d ", *p); p++; } return OK; } Status StackTraverse(SqStack &S) { SElemType *p; if (S.top == S.base) return ERROR; p = S.top - 1; while (p != S.base - 1) { printf("%d ", *p); p--; } return OK; } void main() { int i, n, k, h, a, b; SqStack S; printf("建立一個空棧!\n"); InitStack(S); printf("判斷棧是否為空!\n"); printf("StackEmpty(S)=%d\n", StackEmpty(S)); printf("建立棧的元素個數:\n"); cin >> n; printf("輸入%d個入棧元素的值:\n", n); for (i = 0; i < n; i++) { cin >> k; Push(S, k); } printf("逆序輸出順序棧元素值:\n"); Stackoutput(S); printf("輸出順序棧元素值:\n"); StackTraverse(S); printf("輸入入棧元素值:"); cin >> h; Push(S, h); printf("輸出入棧後的順序棧元素值:\n"); StackTraverse(S); Pop(S, a); printf("輸出第一個出棧元素值:%d\n", a); Pop(S, a); printf("輸出第二個出棧元素值:%d\n", a); printf("輸出兩次出棧後順序棧元素值:"); StackTraverse(S); GetTop(S, b); printf("輸出棧頂元素值:%d\n", b); system("pause"); }
2、採用棧的順序儲存表示,程式設計實現表示式中圓括號“( )”和方括號“[ ]”匹配的檢驗。
#include<stdio.h> #include<iostream> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int Status; typedef char SElemType; using namespace std; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S) { S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status StackEmpty(SqStack &S) { if (S.top == S.base) { return TRUE; } else return FALSE; } Status GetTop(SqStack &S, SElemType &e) { if (S.top == S.base) return ERROR; e = *(S.top - 1); return OK; } Status Push(SqStack &S, SElemType e) { if (S.top - S.base >= S.stacksize) { S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType)); if (!S.base) exit(OVERFLOW); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } Status Pop(SqStack &S, SElemType &e) { if (S.top == S.base) return ERROR; e = *--S.top; return OK; } Status Correct(SElemType str[]) { SqStack S; InitStack(S); int i, state = 1; SElemType e; for (i = 0; str[i] != '\0'; i++) { switch (str[i]) { case '(': Push(S,str[i]); break; case '[': Push(S, str[i]); break; case ')': Pop(S, e); if (e != '(') state = 0; break; case ']': Pop(S, e); if (e != '[') state = 0; break; } if (!state) break; } if (StackEmpty(S) && state == 1) return OK; else return ERROR; } void main() { SElemType str[100]; printf("請輸入帶括號的表示式:\n"); cin >> str; if (Correct(str) == OK) printf("括號匹配正確!\n"); else printf("括號匹配不正確!\n"); system("pause"); }