顺序栈
顺序栈的基本操作
1)类型的定义
2)判空操作
3)清空操作
4)求长度
5)入栈,出栈,取栈
<span style="background-color: rgb(51, 255, 51);">//栈类型的定义</span>
#define StackSpaceIncr 20
tydefef struct{
SElemType *base; //SElemType为栈中元素类型,是由使用者自己定义的,用tydefef定义成SElemType这个名字,
int top; //指向<span style="color:#FF0000;">下一次入栈</span>的索引,这里是<span style="color:#FF0000;">虚指针</span>
int stackSize; //栈当前储存空间
}sqStack; //将这个结构体定义成sqStack类型,以后就可以直接使用了。
<span style="background-color: rgb(51, 255, 51);">//初始化操作</span>
Status InitSqStack(sqStack &S,int InitSize){ //Status是表示返回值的类型,也是由用户自己定义
S.base = (SElemType*)malloc(InitSize*sizeof(SElemType));
if( != S.base) return OVERFLOW;
S.stackSize = InitSize;
s.top = 0; //top(虚指针)是指向入栈的位置,入栈的时候,那位置上有元素的话就覆盖,没元素的话就赋值
return OK; //top如果是实指针的话就
}
<span style="background-color: rgb(51, 255, 51);">//判空操作</span>
Status StackIsEmpty(sqStack &S){ <span style="color:#33FFFF;"> //如果是实指针:if(!=S.top+1);</span>
if(!S.top) return TRUE;
else return FLASE;
}
<span style="background-color: rgb(51, 255, 51);">//清空操作</span>
Status clearStack(sqStack &S){ <span style="color:#33FFFF;"> //如果是实指针:if(!=S.top+1);</span>
S.top = 0;
}
<span style="background-color: rgb(51, 255, 51);">//求顺序栈的长度</span>
Status lengthStack(sqStack &S){
return S.top;
}
<span style="background-color: rgb(51, 255, 51);">//入栈操作</span>
//判断栈是否已满
//在top位置插入元素
//top向上移动一个位置
Status push(sqStack &S, SElemType e){
SElemType *newbase;
if(S.top == S.stackSize){ //判断当前栈的空间是否已满
newbase = (SElemType*)realloc(S.base,(S.stackSize + StackSpaceIncr) * sizeof(SElemType));
if(!= newbase) //realloc函数:开辟一个指定大小的新的内存,将原来的S.base复制到那里去,再返回一个指针。
return OVERFLOW;
S.base = newbase;
S.stackSize = S.stackSize + StackSpaceIncr;
}
S.base[S.top] = e; //入栈
S.top++; //栈顶指针向上移动一位
return OK; <span style="color:#33FFFF;">//如果top是实指针的话,上面两句语句的顺序就要调转来用</span>
}
<span style="background-color: rgb(51, 255, 51);">//出栈操作</span>
//判断栈是否为空
//将top向下移动一位
//返回出栈元素
Status Pop(){
if( !S.top) return ERROR;
S.top--;
e = S.base[top]; <span style="color:#33CCFF;"><span style="background-color: rgb(255, 255, 255);"> //如果top是实指针的话,上面两句语句的顺序就要调转来用</span></span>
return OK; //这里是写OK,但是一旦用户确定数据的类型后,就得返回具体的值
}
<span style="background-color: rgb(51, 255, 51);">//取栈顶操作</span>
//判空
//直接返回栈顶值
Status getTop(sqStack &S,SElemType e)
{
if(!= S.top) return ERROE;
e = S.base[S.top-1]; <span style="color:#33FFFF;"> //如果top是实指针的话:e = S.base[S.top]</span>
return OK;
}
链式栈
元素个数不确定的时候一般使用链式栈
<span style="background-color: rgb(51, 255, 51);">//链式栈的类型定义</span>
typedef struct stackNode{
SElemType data;
struct stackNode next*;
}*LinkStack;
<span style="background-color: rgb(51, 255, 51);">//初始化操作</span>
//将头指针S赋为空
void InitLinkStack(LinkStack &S){
S = unll;
}
<span style="background-color: rgb(51, 255, 51);">//入栈操作</span>
//将元素e入栈即在单链表S的首端插入值为e的结点
status Push(LinkStack &S,SElemType e){
Lintstack p;
p = (Lintstack*)malloc(sizeof(struct stackNode)); //创建一个结点
if(!p) return OVERFLOW;
p->data = e; //赋值
p->next = S;
S = p;
return OK;
}
<span style="background-color: rgb(51, 204, 0);">//出栈操作</span>
status Pop(LinkStack &S,SElemType e){
if(!S) return ERROR;
p = S; //p指向栈顶
S = S->next; //修改栈顶指针S,指向新栈顶元素
e = p->data;
free(p);
return OK;
}
<span style="background-color: rgb(51, 255, 51);">//取栈顶操作</span>
Status getTop(LinkStack S,SElemType &e){
if(!S) return ERROR;
e =S->data;
return OK;
}