順序棧和鏈式棧(C++實現)


  順序棧,是一種基於數組的存儲表示。

  鏈式棧與順序棧相比有很多優點。當棧需要動態變化時,如果使用順序棧,如果設置過大會造成很多的資源浪費;如果過小,當棧溢出時,需要開辟一塊更大的空間同時將原來棧中的元素全部拷貝過去,造成較大的時間開銷。相反,用鏈接表示可以動態擴充棧的大小;而且可以節約內存空間。

  實現類代碼如下:

  

 1 template<class T>
 2 class SeqStack{
 3         T *element;
 4         int top;
 5         int maxSize;
 6         void overflow(){//棧溢出時擴大棧容量 
 7             T *newArray=new T[maxSize+20];
 8             for(int i=0;i<=top;i++){
 9                 newArray[i]=element[i];
10             }
11             maxSize+=20;
12             delete []element;
13             element=newArray;
14         }
15     public:
16         SeqStack(int sz=50){
17             top=-1;
18             maxSize=sz;
19             element=new T[maxSize];
20         }
21         ~SeqStack(){
22             delete[] element;
23         }
24         void push(const T& x){//進棧 
25             if(isFull()) 
26                 overflow();
27             element[++top]=x;
28         }
29         bool pop(T& x){//出棧 
30             if(isEmpty())
31                 return false;
32             x=element[top--];
33             return true;
34         }
35         bool getTop(T& x){//獲取棧頂元素 
36             if(isEmpty())
37                 return false;
38             x=element[top];
39             return true;
40         }
41         bool isEmpty()const{
42             return (top==-1)?true:false;
43         }
44         bool isFull()const{
45             return (top==maxSize-1)?true:false;
46         }
47         int getSize(){
48             return top+1;
49         }
50         void makeEmpty(){//置棧空 
51             top=-1;
52         }
53 }; 

  測試代碼如下:

  

 1 void menu(){
 2     cout<<"1.進棧"<<endl;
 3     cout<<"2.出棧"<<endl;
 4     cout<<"3.獲取棧頂元素"<<endl;
 5     cout<<"4.棧置空"<<endl;
 6     cout<<"5.退出"<<endl;
 7 } 
 8 template<class T>
 9 void function(int num,SeqStack<T> *ss){
10     switch(num){
11         int x;
12         case 1:
13             cin>>x;
14             ss->push(x);
15             break;
16         case 2:
17             ss->pop(x);
18             break;
19         case 3:
20             ss->getTop(x);
21             cout<<x<<endl; 
22             break;
23         case 4:
24             ss->makeEmpty();
25             break; 
26         default:
27             exit(1);
28     }
29 }
30 
31 int main(int argc, char** argv) {
32     SeqStack<int> *ss=new SeqStack<int>;
33     int num;
34     while(true){
35         menu();
36         cin>>num;
37         function(num,ss);
38     } 
39     delete ss;
40     return 0; 
41 }

  鏈式棧,是一種基於鏈表的存儲表示。

  實現類代碼如下:

 1 template<class T>
 2 struct LinkNode{//鏈表節點 
 3     T data;
 4     LinkNode *link;
 5     LinkNode(const T& args,LinkNode<T> *ptr=NULL){
 6         data=args;
 7         link=ptr;
 8     }
 9 };
10 template<class T>
11 class LinkedStack{
12         LinkNode<T> *top;
13     public:
14         LinkedStack(){
15             top=NULL;    
16             
17         }
18         ~LinkedStack(){
19             makeEmpty();
20         }
21         void push(const T& x){//進棧 
22             top=new LinkNode<T>(x,top);
23         }
24         bool pop(T& x){//出棧 
25             if(isEmpty())
26                 return false;
27             LinkNode<T> *p=top;
28             top=top->link;
29             x=p->data;
30             delete p;
31         }
32         bool getTop(T& x)const{//返回棧頂元素 
33             if(isEmpty())
34                 return false;
35             x=top->data;
36             return true;
37         }
38         bool isEmpty()const{ 
39             return (top==NULL)?true:false;
40         }
41         int getSize()const{
42             LinkNode<T> *p=top;
43             int k=0;
44             while(p!=NULL){
45                 p=p->link;
46                 k++;
47             } 
48             return k;
49         }
50         void makeEmpty(){//棧置空 
51             LinkNode<T> *p;
52             while(top!=NULL){
53                 p=top;
54                 top=top->link;
55                 delete p;
56             }
57         }
58 }; 

  測試代碼如下:

 1 void menu(){
 2     cout<<"1.進棧"<<endl;
 3     cout<<"2.出棧"<<endl;
 4     cout<<"3.獲取棧頂元素"<<endl;
 5     cout<<"4.棧置空"<<endl;
 6     cout<<"5.退出"<<endl;
 7 } 
 8 template<class T>
 9 void function(int num,LinkedStack<T> *ls){
10     switch(num){
11         int x;
12         case 1:
13             cin>>x;
14             ls->push(x);
15             break;
16         case 2:
17             ls->pop(x);
18             break;
19         case 3:
20             ls->getTop(x);
21             cout<<x<<endl;
22             break;
23         case 4:
24             ls->makeEmpty();
25             break;
26         case 5:
27             exit(1); 
28             break;
29     }
30 }
31 int main(int argc, char** argv) {
32     LinkedStack<int> *ls=new LinkedStack<int>;
33     int num;
34     while(true){
35         menu();
36         cin>>num;
37         function(num,ls);
38     } 
39     delete ls;
40     return 0; 
41 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM