顺序栈
-------------存储结构--------------
#define MAXSIZE 100 //顺序栈的存储空间的初始分配量
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈的最大可用容量
}SqStack;
1.初始化O(1)
{
SqStack* S.base =(SqStrack*)malloc(sizeof(MAXSIZE);
if(!S.base) return -1;//即当非S.base存在返回-1,为当S.base不存在时返回-1,
//即为分配内存地址失败。
S.top=S.base;//将base的位置付给top,即第一个进入栈的元素的位置在top处
S.stacksize=MAXSIZE;
return 1;
}
2.入栈 O(1)
//入栈时需要判断是否栈满
{
//设e为新入栈的元素;
if(S.top-S.base==S.stacksize) return -1; //栈满,无法做入栈操作;
*S.top++=e; //可分解为两步:*S.top=e; S.top++;运算符自左往右,
//即先做赋值操作,再做加一操作,入栈操作时每次入栈元素为新的栈顶,指针增1。
return 1;
}
3.出栈 O(1)
//出栈时需要判断是否栈空
{
if(S.top==S.base) return -1; //栈空返回0;
e==*--top; //分解为--S.top; e=*S.top; 先将指针下移,(原栈顶指针指向将入栈的位置,
//先指向第一个元素);再将此时元素赋值给e;
return 1;
}
4.取栈顶元素 O(1)
//取栈顶元素的前提是 有栈顶元素,故判断栈非空
{
if(S.top!=S.base) return *(S.top-1); //此时为取地址符所以可以直接-1;
}
也可为
{
if(S.top==S.base) return -1;
else return e=*(S.top-1);
}
综上,顺序栈与顺序表类似均会收到最大空间的限制,因此也会出现空间浪费和溢出的现象。
由此引入链栈。
链栈
------------链栈的存储结构-------------
typedef struct StackNode
{
ElemType data;
struct StackNode *next:
}StackNode,*LinkStack;
1.初始化 o(1)
//链栈中无头节点,直接指向第一个元素
{
//因此初始化时,栈顶指针置空
LinkStack S=(LinkStack)malloc(sizeof(StackNode));
S=NULL;
return 1;
}
2.入栈 O(1)
{//新元素为e;
LinkStack p=(LinkStack)malloc(sizeof(StackNode));
p->data=e;
p->next=S; //将新节点插入到栈顶位置;
S=p; //将栈顶指针指向p;
return 1;
}
3.出栈 O(1)
//判断是否为空链栈
{
if(S==NULL) return -1;
e=S->data; //将S的数据域赋值给e;
p=S; //将S的地址赋值给p
S=S->next; //顺位到下一元素地址;
free(n);
return 1;
}
4.取栈顶元素 O(1)
//判断是否为空
{
if(S!==NULL) return S->data;
}