棧的基本函式C++實現
阿新 • • 發佈:2018-12-21
前兩天自己照著一些部落格仿寫了棧的C++,其間也出了一些問題,但是通過除錯,各個基本函式都得到了驗證。當然可能存在我不知道的問題,如果有小夥伴驗證我程式碼的時候出現了問題希望可以告知我一下,非常感謝。
程式碼如下:
Stack.h檔案
#pragma once //棧的基本函式實現 #include<iostream> #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef int ElemType; //定義棧節點 struct StackNode { ElemType value; StackNode *ptr; }; //棧類及其相關函式 class Stack { public: //建構函式 Stack(); //解構函式 ~Stack(); //初始化棧 bool InitStack(); //銷燬棧 bool DestroyStack(); //清空棧 void ClearStack(); //判斷棧是否為空。是返回true,否則返回false bool StackEmpty(); //返回棧長度 int StackLength(); //獲取棧頂元素 ElemType GetTop(); //壓棧 void Push(ElemType e); //出棧 ElemType Pop(); //遍歷棧內元素並輸出顯示,但同時會清空棧 void StackTraverse(); private: StackNode *top; StackNode *base; int stacksize; };
Stack.cpp檔案
#include"Stack.h" #include<stdio.h> #include<stdlib.h> //建構函式 Stack::Stack() { top = NULL; base = NULL; stacksize = 0; } //解構函式 Stack::~Stack() { } //棧初始化 bool Stack::InitStack() { base = new StackNode[STACK_INIT_SIZE]; if (!base) { std::cout << "記憶體分配失敗" << std::endl; return false; } top = base; stacksize = STACK_INIT_SIZE; return true; } //銷燬棧 bool Stack::DestroyStack() { if (base) { delete base; base = NULL; top = NULL; stacksize = 0; std::cout << "棧銷燬成功" << std::endl; return true; } else { std::cout << "棧記憶體分配失敗,不能銷燬棧" << std::endl; return false; } } //清空棧 void Stack::ClearStack() { top = base; } //判斷棧是否為空 bool Stack::StackEmpty() { if (base == top) { return true; } else { return false; } } //返回棧元素長度 int Stack::StackLength() { return (top - base); } //獲取棧頂元素 ElemType Stack::GetTop() { ElemType e; if (top >base) { e =(top--)->value; return e; } else { return false; } } //壓棧 void Stack::Push(ElemType e) { //若棧滿,追加儲存空間 if (top -base >= stacksize) { base = (StackNode*)realloc(base,stacksize + STACKINCREMENT*sizeof(StackNode)); if (!base) { std::cout << "棧記憶體分配失敗" << std::endl; exit(-1); } top = base +stacksize; stacksize += STACKINCREMENT; } /*注意入棧時一定先賦值,然後棧頂再加1*/ top->value = e; top++; stacksize++; } /*這種壓棧方式存在問題,後續思考一下*/ //void Stack::Push(ElemType data) //{ // StackNode *temp; // temp = (StackNode *)new StackNode[1]; // temp->value = data; // temp->next = NULL; // if (stacksize == 0) // { top = (StackNode *)new StackNode[1]; // base = temp; // } // top->next = temp; // top = temp; // stacksize++; // std::cout << "Push: 入棧成功!" << std::endl; //} //出棧 ElemType Stack::Pop() { ElemType e; if (top == base) { std::cout << "棧為空,無法出棧" << std::endl; exit(-1); } else { e = (--top)->value; top->value = 0; stacksize--; return e; } } //遍歷棧內容 void Stack::StackTraverse() { ElemType e=0; if (top==base) { std::cout << "棧為空,無法出棧" << std::endl; exit(-1); } else { std::cout << "棧內元素為:"; do { e=Pop(); std::cout <<e<< " "; //std::cout << (--top)->value << " "; } while (top!=base); std::cout << std::endl; } }