数据结构第七篇——顺序栈
♥注:未经博主同意,不得转载。
栈(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、