資料結構必須掌握 棧---壓棧和出棧
阿新 • • 發佈:2019-02-04
今天剛學到壓棧出棧,就把這個具體過程都實現了一遍,廢話不多說,程式碼如下:
#include"stdafx.h" #include<iostream> using namespace std; typedef class list { public: int data; list*next; }; typedef struct stack { list*ptop; list*pbottom; }STACK,*PSTACK;//PSTACK等價於struct STACK* list*head=NULL; void initstack(PSTACK ps)//建立一個空棧 { ps->ptop=new list; if(NULL==ps->ptop) { cout<<"動分配記憶體失敗..."<<endl; exit(-1); } else { ps->pbottom=ps->ptop; ps->ptop->next=NULL; } } void push(PSTACK ps,int val) { list*p1=new list;//建立一個新節點 p1->data=val;//資料域存資料 p1->next=ps->ptop;//這裡p1的下一個結點一定要指向ptop,因為壓棧每次都壓到棧頂,所以下一個結點就是當前ptop ps->ptop=p1;//把新結點地址放到top裡面 } void traverse(PSTACK ps)//遍歷棧,即找一個指標,首先等於top,因為top指向棧的第一個結點 { list*p=ps->ptop; while(p!=ps->pbottom) { cout<<p->data<<" "; p=p->next; } cout<<endl; } bool empty(PSTACK ps) { if(ps->ptop==ps->pbottom) return true; else return false; } bool pop(PSTACK ps,int *val) { if(empty(ps)) return false; else { list*t; t=ps->ptop; *val=t->data;//t->data是一個值,需要用*val來接收,val是一個指標,裡面是地址 delete t; t=NULL; return true; } } void clear(PSTACK ps) { if(empty(ps)) return; else { list*p,*q; p=ps->ptop; q=NULL; while(p!=ps->pbottom) { q=p->next; delete p; p=q; } ps->ptop=ps->pbottom; } } int main() { int val; STACK s;//STACK等價於struct stack initstack(&s);//需要傳進去一個地址來修改 cout<<"i是依次為0,1,2,3,4,5,6,7,8進棧"<<endl; cout<<"當前棧裡面的資料順序為:"<<endl; for(int i=0;i<9;i++) push(&s,i); traverse(&s); if(pop(&s,&val)) { cout<<"出棧成功,出棧元素為:"<<val<<" "; } else { cout<<"出棧失敗...."<<endl; } clear(&s); system("pause"); return 0; }