目录
一、顺序栈的表示和实现
1.初始化
为顺序栈分配空间,栈顶指针top初始为base表示栈为空。
Status InitStack(SqStack& S)
{
// 为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
s.base = new SElemType(MAXSIZE);;
//存储分配失败
if (!S.base) exit(OVERFLOW);
//top初始为base,表示空栈
S.top = S.base;
//stacksize置为栈的最大容量MAXSIZE
S.stacksize = MAXSIZE;
return OK;
}
2.入栈
判断栈是否满;将插入的新元素压入栈顶,栈顶指针加1.
//插入元素为e为新的栈顶元素
Status push(SqStack& S, SElemType e)
{
if (S.top - S.base == S.stacksize)//栈满
{
return ERROR;
}
//将元素e压入栈顶,栈顶指针加1
* S.top = e;
S.top++;
return OK;
}
3.出栈
判断栈是否空;栈顶指针减1,栈顶元素出栈。
//若栈不空,则删除S的栈顶元素
Status Pop(SqStack& S, SElemType& e)
{
if (S.top == S.base) //栈空
{
return ERROR;
}
--S.top; //栈顶指针下移,指向栈顶元素
e = *S.top; //用e接收栈顶元素
return OK;
}
二、链栈的表示和实现
1.初始化
初始化链栈,将栈顶指针置空
//构造一个空栈S,减栈顶指针置空
void InisStack(LinkStack &S)
{
S = NULL;
return OK;
}
2.入栈
为入栈元素e分配空间,用指针p指向新空间;将新结点数据域置为e并插入栈顶,将栈顶指针改为p。
//在栈顶插入元素e
Status Push(LinkStack &S,SElemType e)
{
p = new StackNode;//生成新结点p
p -> data = e;//将新街点数据域置为e
p -> next = S;//将新结点插入栈顶
S = p;//修改栈顶指针为p
return OK;
}
3.出栈
判断栈是否为空;将栈顶元素赋给返回值e,临时保存栈顶元素空间,将栈顶指针修改到指向新的元素,释放原栈顶元素空间。
Status pop(LinkStack &S,SElemType &e)
{
if(NULL == S)
{
return ERROR; //栈空
}
e = S->data; //将栈顶元素赋给 e
p = S; //用p临时保存栈顶元素空间,以备释放
S = S->next; //修改栈顶指针
delete p; //释放原来栈顶元素的空间
return OK;
}