栈
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; }
相关文章推荐
- 使用Vitamio带有缓冲百分比
- druid 配置WebStatFilter 网络url统计
- 快速集成微信支付和支付宝支付
- C++之C语言增强
- 求树的深度--20150926
- 原型模式
- web前端,js实现div隐藏显示
- 内存池的作用--减少内存碎片
- hdu5489(2015合肥网络赛F题)
- V字首类破解补丁速查
- 给CSDN的建议(2)
- poj1182
- VEX 常用的函数和语句(一)
- Android 基础5
- Github Hacking
- 深入浅出JMS(四)--Spring和ActiveMQ整合的完整实例
- 深入浅出JMS(三)--ActiveMQ简单的HelloWorld实例
- A Quarter-Car Vehicle Model Based Feature for Wheeled and Tracked Vehicle Classification
- 地面机动车辆识别算法的鲁棒性研究
- A Seismic-Based Feature Extraction Algorithm for Robust Ground Target Classification