您的位置:首页 > 其它

2015-09-28 20:47 309 查看

顺序栈

顺序栈的基本操作

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: