一、顺序栈
以下操作中S.top均指向的是栈顶元素上方的位置
取栈顶元素:
e = *(S.top-1);
进栈操作:
*S.top++=e; //插入新的元素,栈顶指针上移(先*S.top = e,再S.top++)
出栈操作:
e = *--S.top;//元素从栈顶蹦出,栈顶指针下移(先S.top--,再*S.top = e)
二、链栈
1.说明:
(1)链栈中指针的方向是从栈顶指向栈底
(2)链栈中一般不设头结点
2.链栈的存储结构
typedef struct LNode
{
SElemType data;
struct LNode *next; //这个地方容易出错哦!!
}LNode,*LinkStack;
typedef struct Stack
{
LinkStack top;
int count;
}
3.进出栈操作
//入栈操作
Status Push(LinkStack &S,SElemType &e)
{
p = (LinkStack)malloc(sizeof(LNode));
if(!p)
exit(OVERFLOW);//存储分配失败
p->data = e;
p ->next = S.top;
S.top = p;
S.count++;
return OK;
}
//出栈操作
Status Pop(LinkStack &S,ElemType &e)
{
if(S.top == NULL)//判断栈不是空栈
return ERROR;
LinkStack p;
e = S.top->data;
p = S.top;
S.top = S.top->next;
free(p);
return OK;
}
4.操作时间复杂度
顺序栈:进出栈:O(1) 清空栈:O(1)
链式栈:进出栈:O(1)清空栈:O(n)