栈:是限定仅在表尾进行插入或删除操作的线性表,表尾段称为栈顶,表头段称为栈底,栈有称后进先出线性表。栈有顺序栈和链栈。
一、栈的顺序存储
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); }
栈的应用(进制间的转换):
1 //二进制转十进制 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<math.h> 5 6 #define STACK_INIT_SIZE 20 7 #define STACKINCREMENT 10 8 9 typedef char ElemType; 10 11 typedef struct{ 12 ElemType *base; 13 ElemType *top; 14 int stackSize; 15 }sqStack; 16 17 void InitStack(sqStack &s){ 18 s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); 19 if( !s.base ) 20 exit(0); 21 s.top = s.base; 22 s.stackSize = STACK_INIT_SIZE; 23 } 24 25 void Push(sqStack &s, ElemType e){ 26 if( s.top-s.base >= s.stackSize ){ 27 s.base = (ElemType *)realloc(s.base, (s.stackSize+STACKINCREMENT)*sizeof(ElemType)); 28 if( !s.base ) 29 exit(0); 30 } 31 *s.top = e; 32 s.top++; 33 } 34 35 void Pop(sqStack &s, ElemType &e){ 36 if( s.top == s.base ) 37 return ; 38 e = *--s.top; 39 } 40 41 int StackLen(sqStack s){ 42 return (s.top-s.base); 43 } 44 45 int main(){ 46 ElemType c; 47 int len,sum = 0; 48 sqStack s; 49 InitStack(s); 50 printf("请输入一个二进制数,输入#表示结束!\n"); 51 scanf("%c",&c); 52 while( c != '#' ){ 53 Push(s,c); 54 scanf("%c",&c); 55 } 56 getchar(); 57 len = StackLen(s); 58 printf("栈的当前容量是:%d\n",len); 59 for(int i = 0; i <len; i++){ 60 Pop(s,c); 61 sum = sum+(c-48)*pow(2,i); 62 } 63 printf("转化为十进制数为:%d\n",sum); 64 return 0; 65 }