1、栈
栈也属于线性表,但是和顺序表的操作有些不用。线性表就像用书立放着的一堆书,想用的时候,随便可以取用里面的一本,也可以交换书的顺序。
然而,栈就像一堆叠放着的书,我们每次只能拿最上面的书,当然也再加一本书也只能放在最上面。
2、栈的抽象数据类型
3、栈的实现
3.1栈的初始化
对于顺序栈,初始化就是要给栈分配好内存空间,并且给栈的属性(栈的最大容量,当前栈的长度等)初始化。
void InitStack_Sq(SqStack &S,int maxsize,int incresize)
{
S.stack = (ElemType *)malloc(maxsize * sizeof(ElemType));//分配栈空间
if (S.stack == NULL)//如果分配失败,退出
{
exit(0);
}
S.top = -1;//空栈
S.stacksize = maxsize;
S.increamentsize = incresize;
}
3.2求栈的长度
和顺序表一样,直接返回当前栈的长度就可以了。
int StackLength_Sq(SqStack S)
{
return S.top + 1;
}
3.3进栈
栈的操作中,进栈和出栈是最重要的两个操作。进栈就相当于在前面的比喻中,在一堆书上面再放上一本书。
和放书的操作一样,在放之前我们有必要看看是不是书的高度已经到顶了(栈满了),如果满了就想办法看能不能增加一点空间,然后再把书放上去。
官方一点就是:先判断栈是否已满,若已满,则重新分配空间,然后将栈顶指针加1,再将元素插入到栈中。
bool Push_Sq(SqStack &S,ElemType e)
{
if (StackLength_Sq(S) >= S.stacksize)
{
S.stack = (ElemType *) realloc (S.stack,(S.stacksize + S.increamentsize) * sizeof(ElemType));
if (S.stack == NULL)
{
return false;
}
S.stacksize += S.increamentsize;
}
S.stack[++S.top] = e;
return true;
}
3.4出栈
出栈就不用像进栈那样要判断是不是没有空间了,但是,和拿书一样,在拿之前我们要先看看是不是有书(判断栈是否为空)。
实现过程:先判断栈是否为空,若不为空,则取栈顶元素,并将栈顶指针减1。
bool Pop_Sq(SqStack &S,ElemType &e)
{
if (S.top == -1)
{
return false;
}
e = S.stack[S.top--];
return true;
}
3.5取栈顶元素
这个和出栈有点不一样,但是也有点相似。不同的是,取栈顶元素不用将栈顶元素取出后删除(这个有点像复制,把栈顶元素复制一个)。
bool GetTop_Sq(SqStack S,ElemType &e)
{
if (S.top == -1)
{
return false;
}
e = S.stack[S.top];
return true;
}
3.6判空
栈是否为空也是栈的一个属性,所以,和求栈的长度一样,直接返回值就行了。
bool StackEmpty_Sq(SqStack S)
{
if (S.top == -1)
{
return true;
}
else
{
return false;
}
}
3.7销毁
栈在用完之后就要销毁,顺序栈的销毁就是把栈内数据全部销毁,然后将栈的各个属性归零。
void DestroyStack_Sq(SqStack &S)
{
free(S.stack);
S.stacksize = 0;
S.top = -1;
}
4.实现测试
main.cpp
#include <iostream>
#include <iomanip>
#include "stack.h"
using namespace std;
void main()
{
SqStack myStack;
ElemType num[10] = {0,1,2,3,4,5,6,7,8,9};
ElemType temp;
InitStack_Sq(myStack,100,100);
cout<<"进栈顺序:"<<endl;
for (int i = 0;i < 10;i ++)
{
if ( !Push_Sq(myStack,num[i]) )
{
cout<<"进栈失败"<<endl;
system("pause");
return;
}
else
{
cout<<setw(4)<<num[i];
}
}
cout<<endl;
cout<<"出栈顺序:"<<endl;
for (int i = 0;i < 10;i ++)
{
if (!Pop_Sq(myStack,temp))
{
cout<<"出栈失败"<<endl;
system("pause");
return;
}
else
{
cout<<setw(4)<<temp;
}
}
cout<<endl;
DestroyStack_Sq(myStack);
system("pause");
}
结果:
————————————————————————————————————————————————