順序棧的初始化,進棧、出棧、求長、判空、訪頂、遍歷、清空、銷燬
阿新 • • 發佈:2019-02-10
順序棧即棧的順序儲存結構,它利用一組地址連續的儲存單元存放自棧底到棧頂的元素,是一種後進先出(last in first out,LIFO)的線性表。
判斷棧不存在的條件為:S.base=NULL;
空棧:S.base=S.top;
滿棧:S.top-S.base=S.stacksize;
#include "stdafx.h" #include <iostream> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int ElemType; typedef int Status; using namespace std; typedef struct Stack { int *base; int *top; int stacksize; //當前已分配的儲存空間 }SqStack; bool initStack(SqStack &S) { S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if (!S.base) { cout << "記憶體分配失敗!" << endl; exit(OVERFLOW); } S.top = S.base; S.stacksize = STACK_INIT_SIZE; return true; } //判斷棧是否為空 bool isStackEmpty(SqStack &S) { if (S.top == S.base) return true; else return false; } //取棧頂元素,並將值返回 Status getTop(SqStack &S) { if (isStackEmpty(S)) { cout << "棧為空!" << endl; return 0; } return *(S.top - 1); } //插入元素e為棧頂元素 Status push(SqStack &S, ElemType e) { if (S.top - S.base >= S.stacksize) //棧滿,追加棧的空間 { S.base = (ElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType)); if (!S.base) { exit(OVERFLOW); } S.top = S.base + S.stacksize; //基地址+當前記憶體空間 S.stacksize += STACKINCREMENT; } *S.top = e; S.top++; return true; } //刪除棧頂元素,並返回 Status pop(SqStack &S) { ElemType e; if (isStackEmpty(S)) { cout << "棧為空!" << endl; return false; } return *(--S.top); } //獲取棧的長度 Status getStackLength(SqStack &S) { return S.top - S.base; } //清空棧 bool clearStack(SqStack &S) { while (!isStackEmpty(S)) pop(S); return true; } //銷燬棧 bool destroyStack(SqStack &S) { clearStack(S); S.stacksize = 0; S.top = S.base = NULL; return true; } Status visit(ElemType e) { cout << e << " "; return true; } //遍歷棧,遍歷順序為出棧的順序 void stackTraverse(SqStack &S) { if (isStackEmpty(S)) { cout << "棧為空!" << endl; exit(0); } while (!isStackEmpty(S)) { visit(*(--S.top)); } cout << endl; } int main() { SqStack stack; cout << "構造了一個空棧" << endl;; initStack(stack); ElemType e; cout << "向棧中插入第一個元素:"; cin >> e; push(stack, e); cout << "向棧中插入第二個元素:"; cin >> e; push(stack, e); cout << "向棧中插入第三個元素:"; cin >> e; push(stack, e); cout << "獲取棧頂元素:" << getTop(stack); cout << endl << "執行一次出棧操作,出棧元素為:" << pop(stack); cout << endl << "獲取棧頂元素:" << getTop(stack); cout << endl << "獲取棧的長度:" << getStackLength(stack); cout << endl << "遍歷棧:"; stackTraverse(stack); cout << "執行清棧操作" << endl;; clearStack(stack); stackTraverse(stack); system("pause"); return 0; }