顺序栈和链式栈(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 }

原文链接: https://www.cnblogs.com/ytz1996/p/6290449.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/247835

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午2:30
下一篇 2023年2月14日 上午2:30

相关推荐