栈定义
栈(Stack)是限定只能在表的一端(表尾)进行插人或刪除操作的线性表。允许进行插人或删除的这一端称为栈顶(Top);另一端则称栈底(Bottom),不能进行插人或删除。
当栈中没有包含数据元素时,称为空栈。栈非空时,处于栈顶位置的元素称为栈顶元素。向一个栈插人新的元素称为人栈或进栈(Push),此时,插人的元素成为新的栈顶元素;从找中删除一个元素时,只能删除当前的栈顶元素,称为出栈或退栈(Pop)。
由于栈的插人和删除只能在栈顶进行,最先人栈的元素必定最后出栈,最后人栈的元素最先出栈,因此栈又叫做后进先出(Last In First Out,LIFO)线性表。
顺序表的表示与实现
与顺序表类似,顺序栈就是用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
实现代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define STACK_INITsize 5
#define STACK_INCREASE 5
typedef struct {
int *base;
int *top;
int stacksize;//分配存储空间
} sqlstack;
int initStack(sqlstack *p){
p->base = malloc(sizeof(int)*STACK_INITsize);//开辟了STACK_INITsize
//个int内存单元,p->base指向第一个内存单元。
if(p->base==NULL){
return ERROR;
}
p->stacksize = STACK_INITsize;
p->top = p->base;//设置为空栈
return OK;
}
int EmptyStack(sqlstack *p){
if(p->base==p->top){
printf("栈是空栈\n");
}else{
printf("栈不是空栈 \n");
}
return OK;
}
int pushStack(sqlstack *p,int value){
if(p->top-p->base>=p->stacksize){
p->base = realloc(p->base,(p->stacksize+STACK_INCREASE)*sizeof(int));
if(p->base==NULL){
return ERROR;
}
p->top = p->base+p->stacksize;
p->stacksize+=STACK_INCREASE;
}
p->top++;//栈顶指针加1, p->top指向的是int的内存单元格,所以每次移动一下,指针地址是加上4.
*(p->top) = value;
return OK;
}
int popStack(sqlstack *p){
if(p->top==p->base){
//空栈
return ERROR;
}
p->top--;
printf("出栈一个元素 \n");
return OK;
}
int getTop(sqlstack *p){
if(p->base==p->top){
return ERROR;
}
printf("栈顶的元素: %d \n",*(p->top));
return OK;
}
int main()
{
int choice;
sqlstack *p = malloc(sizeof(sqlstack));
int value;
do{
printf("1 栈的初始化 \n");
printf("2 判断栈是否为空 \n");
printf("3 入栈的操作 \n");
printf("4 出栈的操作 \n");
printf("5 取栈顶元素 \n");
scanf("%d",&choice);
switch(choice){
case 1:
initStack(p);
break;
case 2:
EmptyStack(p);
break;
case 3:
printf("请输入要入栈的值:\n");
scanf("%d",&value);
pushStack(p,value);
break;
case 4:
popStack(p);
break;
case 5:
getTop(p);
break;
}
}while(choice>0);
}