資料結構C/C++程式碼實現 順序表棧基本操作
順序表棧基本操作的實現 原始碼:
#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXSIZE 100 //#define Status int #define OK 1 #define OVERFLOW -2 #define False 0 #define True 1 #define ERROR 0
typedef int SElemType; typedef int Status; typedef struct { SElemType *base; //棧底指標 SElemType *top; //棧頂指標 int stacksize; //棧可用最大容量 }SqStack;
//順序棧的初始化 Status InitStack(SqStack &s) { s.base=new SElemType[MAXSIZE]; //為順序棧動態分配一個最大容量為MAXSIZE的陣列空間 if(!s.base) exit(OVERFLOW); //儲存分配失敗 s.top=s.base; //top初始為base,空棧 s.stacksize=MAXSIZE; //stacksize置為棧的最大容量MAXSIZE return OK; }
//入棧 Status Push(SqStack &s,SElemType e) //插入元素 e 為新的棧頂元素 { if(s.top-s.base==s.stacksize) return ERROR; //棧滿 *s.top=e; s.top++; //也可以直接寫成 *s.top++=e; return OK; }
//出棧 Status Pop(SqStack &s,SElemType &e) //刪除 s 的棧頂元素,用 e 返回其值 { if(s.top==s.base) return ERROR; s.top--; e=*s.top; //也可以直接寫成 e=*--s.top; return OK; }
//取棧頂元素 SElemType GetTop(SqStack s) //返回 S 的棧頂元素,不修改棧頂指標 { if(s.top != s.base) //棧非空 return *(s.top-1); //返回棧頂元素的值,不修改棧頂指標 }
//銷燬棧 Status Destroy(SqStack s) { free(s.base); s.base = NULL; s.top = NULL; s.stacksize=0; return OK; }
//遍歷棧 Status StackTraver(SqStack s,Status(*visit)(SElemType)) { SElemType *b = s.base;//此處不能直接用base或top移動,即不能改變原棧的結構 SElemType *t = s.top; while(t > b) visit(*b++); //cout<<"\n"; return OK; } Status visit(SElemType c) { cout<<c<<endl; return OK; } int main () { SElemType e; SqStack s; InitStack(s) ; int n; cout<<"請輸入要進棧的個數:"<<endl; cin>>n; while(n--) { int m; cin>>m; Push(s,m); } cout<<"棧中資料為:"<<endl; StackTraver(s, visit); Pop(s,e); cout<<"出棧的元素是:"<<e<<endl; Destroy(s); return 0; }