数据结构第七篇——顺序栈

♥注:未经博主同意,不得转载。

  栈(stack)是常用的重要数据结构,其应用十分广泛。栈是一个操作受限的线性表,其插入和删除操作都在表的同一端进行。

  其中允许操作的一端称为栈顶(top),另一端称为栈底(bottom),不含元素的栈称为空栈

  栈的修改是按后进先出的原则进行的,因此,栈称为后进先出表(Last In First Out,LIFO)。称插入元素的操作为入栈(push),删除元素的操作为出栈(pop)。

  栈由元素列表、指向栈顶的下标或指针以及栈的操作集组成。栈的具体实现有两种方式:顺序栈和链栈。

顺序栈

  顺序栈的说明包括表StackList和栈顶下标(top)。初始时栈为空,此时top=-1,每当一个元素进栈(push)时,top的值增一,每当一个元素出栈(pop)时,top的值减一。

  使用数组存放数据元素时,需要定义函数IsFull()判断栈满的情况。

顺序栈的定义如下:

 1 const int MaxStackSize=50;
 2 typedef int DataType;
 3 class Stack
 4 {
 5     private:
 6         DataType StackList[MaxStackSize];
 7         int top;
 8     public:
 9         Stack(){top=-1;}
10         ~Stack(){};
11         
12         void Push(DataType item);    //进栈
13         DataType Pop();                //出栈
14         DataType GetTop();            //取栈顶操作
15         void Clear();                    //置空栈
16         bool IsEmpty();                //判栈空否 
17         bool IsFull();                 //判栈满否 
18         void Print();                    //打印数据 
19 };

下面给出部分操作的算法描述:

 1 //判断栈是否为空 
 2 bool Stack::IsEmpty()
 3 {
 4     if(top==-1)
 5     return true;     
 6     else 
 7     return false;       
 8 }
 9 //判断栈是否已满
10 bool Stack::IsFull()
11 {
12     if(top==MaxStackSize-1)
13     return true;
14     else
15     return false;
16 } 
17 //取栈顶元素
18 DataType Stack::GetTop()
19 {
20     if(IsEmpty())
21     {
22         cout<<"栈空!"<<endl;
23         exit(0); 
24     }
25     return StackList[top];
26 } 
27 //进栈
28 void Stack::Push(DataType x)
29 {
30     if(IsFull())
31     {
32         cout<<"栈满"<<endl;
33         exit(0);
34     }
35     else
36     StackList[++top]=x;
37 } 
38 //出栈
39 DataType Stack::Pop()
40 {
41     if(IsEmpty())
42     {
43         cout<<"栈空"<<endl;
44         exit(0);
45     }
46     return StackList[top--];
47 } 
48 //清空栈
49 void Stack::Clear()
50 {
51     top=-1;
52 } 
53 //打印数据
54 void Stack::Print()
55 {
56     for(int i=top;i>-1;--i)
57     cout<<StackList[i]<<"  ";
58     cout<<endl; 
59 } 

测试部分则放在main函数:

 1 int main()
 2 {
 3     Stack stack;
 4     DataType a[10]={2,5,8,6,9,85,6,9,9,7};
 5     DataType e;
 6     if(stack.IsEmpty())
 7     cout<<"此栈为空"<<endl;
 8     else
 9     cout<<"此栈不空"<<endl;
10     
11     if(stack.IsFull())
12     cout<<"此栈已满"<<endl;
13     else
14     cout<<"此栈不满"<<endl;
15     
16     for(int i=0;i<8;++i) 
17         stack.Push(a[i]);
18         
19     stack.Print();
20     
21     cout<<stack.GetTop()<<endl;
22     
23     cout<<"进栈:";
24     cin>>e;
25     stack.Push(e);
26     stack.Print();
27     cout<<stack.GetTop()<<endl;
28     
29     cout<<"出栈:";
30     stack.Pop();
31     stack.Print();
32     cout<<stack.GetTop()<<endl;
33     
34     if(stack.IsEmpty())
35     cout<<"此栈为空"<<endl;
36     else
37     cout<<"此栈不空"<<endl;
38     
39     if(stack.IsFull())
40     cout<<"此栈已满"<<endl;
41     else
42     cout<<"此栈不满"<<endl;
43     
44     cout<<"出栈:";
45     stack.Pop();
46     stack.Print();
47     
48     cout<<"清空栈:"<<endl;
49     stack.Clear();
50     
51     if(stack.IsEmpty())
52     cout<<"此栈为空"<<endl;
53     else
54     cout<<"此栈不空"<<endl;
55      
56     return 0;
57 }

简单的测试结果如下:

定义顺序栈时,应该知道所需的最大栈长度。如果事先无法预知栈的最大长度,可以采用链栈。

链栈的建立请转至http://www.cnblogs.com/tenjl-exv/p/7580418.html

v、

posted @ 2017-09-23 10:17  T丶jl  阅读(661)  评论(0编辑  收藏  举报