宏定义部分
#define STACK_INIT_SIZE 100 //栈的初始容量
#define STACKINCREMENT 10 //每次再分配的容量
栈的定义:
typedef struct{
int *base; //栈底
int *top; //栈顶
int stacksize; //当前栈的容量
}SqStack;
建栈
bool InitStack(SqStack &S){
S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); //为栈分配大小为STACK_INIT_SIZE的空间
if(!S.base)return false; //如果分配空间失败,处理
//exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE; //初始时,栈顶指针=栈底指针,栈的容量为STACK_INIT_SIZE
cout<<"Create stack successfully!"<<endl;
return true;
}
入栈
bool Push(SqStack &S,int e){
//对空间进行判断,如果空间超过,进行再分配
if(S.top-S.base >= S.stacksize * sizeof(int) ){
S.base=(int *)realloc(S.base,S.stacksize + STACKINCREMENT * sizeof(int));
if(!S.base)return false;
//exit(OVERFLOW);
//realloc使用后可能会影响栈底base的指针,所以重新寻找栈顶top
S.top=S.base+S.stacksize * sizeof(int);
S.stacksize += STACKINCREMENT;//栈的容量增加
}
//入栈操作
*(S.top)=e; //将e压入
S.top+=sizeof(int); //栈顶指针变化
return true;
}
出栈
bool Pop(SqStack &S,int &e){
if(S.top==S.base)
{
cout<<"empty!"<<endl;
return false;
}
S.top-=sizeof(int);
e= *(S.top);
return true;
}
得到栈顶元素
bool GetTop(SqStack S, int &e)
{
if(S.top==S.base)
{
cout<<"empty!"<<endl;
return false;
}
S.top-=sizeof(int);
e = *(S.top);
}
得到栈长
int StackLength(SqStack S){
return (S.top-S.base)/sizeof(int);
}
遍历所有
bool StackTraverse(SqStack S){
if(S.top==S.base)
{
cout<<"empty!"<<endl;
return false;
}
int *temp;
temp=S.base;
while(temp < S.top)
{
//对每一项数据进行的操作 visit();
cout<< *temp<<endl;
temp=temp+sizeof(int);
}
return true;
}
其实,栈和线性表都是通过访问地址得到元素,是常用的数据结构。