栈:是限定仅在表尾进行插入或删除操作的线性表,表尾段称为栈顶,表头段称为栈底,栈有称后进先出线性表。栈有顺序栈和链栈。
1、顺序栈的结构定义
//顺序栈的存储结构 typedef struct{ ElemType *base;//栈底指针变量 ElemType *top;//栈顶指针变量 int stackSize;//当前可使用的最大容量 }sqStack;
2、创建一个空栈
//创建一个空栈 #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 Status InitStack(SqStack &s){ s.base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if( !s.base ) exit(OVERFLOW); s.top = s.base; s.stackSize = STACK_INIT_SIZE; return OK; }
3、元素入栈
//元素入栈 Status Push(SqStack &s, ElemType e){ if( s.top-s.base >= s.stackSize ){//若栈满则追加空间 s.base = (ElemType *)realloc(s.base,(s.stackSize+STACKINCREAMENT)*sizeof(ElemType)); if( !s.base ) exit(OVERFLOW); s.top = s.base+s.stackSize; //设置栈顶 s.stackSize = s.stackSize+STACKINCERMENT; //设置栈的最大容量 } *s.top = e; s.top++; //*s.top++ = e; }
4、元素出栈
//元素出栈 Status Pop(SqStack &s, ElemType &e){ //若栈不为空,则用e返回s的栈顶元素 if( s.top == s.base ) return ERROR; e = *--s.top; //s.top指针先向下移动一个位置,再取出其中的元素 return OK; }
5、清空一个栈(将栈顶指针指向栈底指针)
//清空一个栈 Status ClearStack(SqStack &s){ s.top = s.base; //栈顶指针指向栈底指针 return OK; }
6、销毁一个栈
//销毁栈 Status DestroyStack(SqStack &s){ int len = s.stackSize; for(int i =0; i < len; i++){ free(s.base); s.base++; } s.base = s.top = NULL; s,stackSize = 0; }
7、返回栈的当前容量
//返回栈当前容量 Status StackLen(SqStack &s){ return (s.yop-s.base); }
栈的应用(进制间的转换):