导语
栈是只允许在一段进行插入和删除操作的线性表,其中允许进行插入删除操作的一端称为栈顶,另一端称为栈底。
栈的基本操作包括有:在栈顶进行插入删除操作、栈的初始化、判断栈是否为空、取栈顶元素、遍历栈。
- 栈的结构定义
typedef struct Stack{
sElemType data;//栈中的数据
sElemType *top;//栈顶指针
sElemType *base;//栈底指针
int stacksize;//栈底大小
}Stack;
- 栈的初始化
//初始化一个空栈
Status InitStack(Stack &S) {
S.base=(sElemType*)malloc(maxSize*sizeof(sElemType));//分配存储空间
if(!S.base) return ERROR; //存储空间分配失败
S.top=S.base; //栈空
S.stacksize=maxSize; //设置最大栈空间
return OK;
}
- 判断栈是否为空
栈判断是否为空就是通过判断栈底和栈底是否相等
//判断栈是否为空、
Status StackEmpty(Stack S){
if(S.top==S.base)//栈空
return FALSE;
else
return TRUE;
}
- 取栈顶元素
//获取栈顶元素
Status getTop(Stack S,sElemType &e){
if(S.base==S.top) return ERROR;//栈空
e =*(S.top-1);
return OK;
}
- 在栈顶插入新元素为栈顶
这里传入的是栈的地址,目的是在函数中插入新的栈顶后会退出,传入地址可以真实改变栈顶,而不仅仅只是在这个函数中发生改变。
//插入新元素为栈顶
Status Push(Stack &S,sElemType e){
if(S.top-S.base>=S.stacksize){
S.base =(sElemType*)realloc(S.base,STACKINCREMENT*sizeof(sElemType)) ;
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.stacksize+S.base;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}
- 删除栈顶元素
//删除栈顶元素
Status Pop(Stack &S,sElemType &e){
if(S.top==S.base) return ERROR;//栈空
// e=*(S.top-1);
// S.top--;
e=*--S.top;//与上边注释的两行代码等价
return OK;
}
- 遍历栈
//遍历栈
Status StackTraverse(Stack S ) {
sElemType *b=S.base;
sElemType *t=S.top;
if(b==t) return ERROR;
while(t>b){//栈不为空
visit(*b);
b++;
}
printf("\n");
return OK;
}
- 总结:在上述代码中发现,凡是涉及到要真实改变栈中的数据的传入的都是地址,不涉及栈的数据改变的传入的都只是当做形参变量在使用。在对栈进行操作时格外要注意栈是否为空。
演示代码可以去github查看或下载。