資料結構——鏈棧
阿新 • • 發佈:2018-12-17
//LinkStack.h #include<iostream> #include<cstdlib> #define ERROR -1 #define OK 1 #define TRUE 0 #define FALSE -2 using namespace std; typedef int SElemType; typedef int Status; typedef struct SNode { SElemType data; struct SNode *next; }SNode,*UnitStack; class LinkStack { public: LinkStack();//構造 ~LinkStack();//銷燬 Status InputStack(SElemType e);//輸入 Status DeStack(SElemType &e);//刪除 int StackLength();//返回鏈棧長度 Status StackEmpty();//判斷空戰 Status GetStack(SElemType &e);//返回棧頂 Status ClearStack();//清空鏈棧 private: UnitStack top; };
//LinkStack.cpp #include "LinkStack.h" LinkStack::LinkStack() { //建立鏈棧 top = (UnitStack)malloc(sizeof(SNode)); if (!top) { cout << "鏈棧建立失敗!退出......" << endl; return; } top->next = NULL; cout << "鏈棧建立成功!!!" << endl; }//LinkStack LinkStack::~LinkStack() { //銷燬 UnitStack s; while (top) { s = top->next; top->next = s->next; free(s); } cout << "銷燬成功!" << endl; }//~LinkStack Status LinkStack::InputStack( SElemType e) { //輸入 UnitStack s; s = (UnitStack)malloc(sizeof(SNode)); if (!s) { cout << "入棧失敗!" << endl; return ERROR; } s->data = e; s->next = top->next; top->next = s; return OK; }//InputStack Status LinkStack::DeStack( SElemType &e) { //刪除 UnitStack s; if (top->next==NULL) { cout << "空棧!!!" << endl; return ERROR; } s = top->next; top->next = s->next; e = s->data; free(s); return OK; }//DeStack int LinkStack::StackLength() { //返回鏈棧長度 int Length=0; UnitStack s; s = top->next; while (s) { Length++; s = s->next; } return Length; }//StackLength Status LinkStack::StackEmpty() { //判斷空戰 if (!top->next)return TRUE; return FALSE; }//LinkStack Status LinkStack::GetStack(SElemType &e) { //返回棧頂 UnitStack s; if (!top->next) { cout << "空棧!!!" << endl; return ERROR; } s = top->next; e = s->data; return OK; }//GetStack Status LinkStack::ClearStack() { //清空鏈棧 top->next = NULL; return OK; }
//源.cpp #include"LinkStack.h" int main() { LinkStack LS; SElemType e=0; int c = 0; cout << "輸入入棧元素(輸入-1結束):" << endl; cin >> e; while (e!=-1) { if (LS.InputStack(e) != OK)return 0; cin >> e; } if(LS.StackEmpty()!=TRUE) cout << "入棧成功!!!" << endl; while (1) { cout << "插入 1;刪除 2;鏈棧長度 3;返回棧頂 4;清空 5;退出 9;" << endl; cin >> c; switch (c) { case 1: cout << "輸入插入元素:"; cin >> e; if (LS.InputStack(e) == OK) cout << "插入成功!" << endl; break; case 2: if(LS.DeStack(e)==OK) cout << "刪除成功,刪除元素為:" << e << endl; break; case 3: cout << "鏈棧長度為:" << LS.StackLength() << endl; break; case 4: if (LS.GetStack(e) == OK) { cout << "棧頂元素為:" << e << endl; } break; case 5: LS.ClearStack(); cout << "清空完成!!!" << endl; break; case 9: cout << "退出......" << endl; goto part; break; default: cout << "輸入錯誤!!!" << endl; break; } } part: return 0; }