国外网站入口,终端安全管理系统,wordpress wpdoc,青州市城乡建设局网站目录
栈#xff08;Stack#xff09;栈顶#xff08;top#xff09;栈底#xff08;bottom#xff09;空栈#xff08;不含任何元素#xff09;
创建栈
入栈操作
出栈操作
销毁一个栈
计算栈的当前容量
实例分析 栈的插入操作叫做进栈#xff08;Push#xf…目录
栈Stack栈顶top栈底bottom空栈不含任何元素
创建栈
入栈操作
出栈操作
销毁一个栈
计算栈的当前容量
实例分析 栈的插入操作叫做进栈Push或者称为压栈、入栈。
栈的删除操作叫做出栈Pop或者称为弹栈。
栈又称为先进后出last in first out的后进先出原则称为后进先出的线性表LIFO。
栈的本质上也是一个线性表线性表有两种存储形式那么栈也有分为栈的顺序存储结构和栈的链式存储结构。
最开始栈中不含有任何数据叫做空栈此时栈定就是栈底。然后数据从栈顶进入栈顶栈底分离整个栈的当前容量变大。数据出栈时从栈顶移出栈顶下一整个栈的当前容量变小。
栈的顺序存储结构
typedef struct
{ElemType *base;ElemType *top;int stacksize;}sqStack; 这里定义了一个顺序存储的栈它包含了三个元素basetopstacksize。其中base是指向栈底的指针变量top是指向栈顶的指针变量stacksize指示栈的当前可使用的最大容量。
创建栈
#define STACK_INIT_SIZE 100 initStack(sqStack *s)//创建栈
{s-base (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s-base)exit(0);s-tops-base; //最开始栈顶就是栈底。 s-stacksize STACK_INIT_SIZE;}
入栈操作
#include stdlib.h
#define STACKINCREMENT 10Push(sqStack *s,ElemType e) //入栈操作
{if(s-top - s-base s-stacksize){//如果漫展追加空间 s-base (ElemType *)realloc(s-base,(s-stacksizeSTACKINCREMENT)*sizeof(ElemType));if(!s-base)exit(0);s-tops-base s-stacksize;s-stacksize s-stacksize STACKINCREMENT;}*(s-top)e;s-top; }
出栈操作
出栈操作就是在栈顶取出数据栈顶指针随之下移的操作。
每当从栈内弹出一个数据栈的当前容量就-1.
Pop(sqStack *s,ElemType *e)
{if(s-tops-base)//栈已空return;*e*--(s-top);
}
销毁一个栈
DestrogStack(sqStack *s)
{int i,len;len s-stackSize;for(i0;ilen;i){free(s-base);s-base;}s-base s-top NULL;s-stacksize 0;
}
计算栈的当前容量
计算栈的当前容量也就是计算栈中元素的个数因此只要返回s.top-s.base 即可。
栈的最大容量是指该栈占据内存空间的大小其值是s.stackSzie它与栈的当前容量不是一个概念。
int StackLen(sqStack s)
{return (s.top-s.base1);
}
实例分析
利用栈的数据结构特点将二进制转换为十进制数。
#include stdio.h
#include stdlib.h
#include math.h#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10typedef char ElemType;
typedef struct
{ElemType *base;ElemType *top;int stackSize; }sqStack;void InitStack(sqStack *s)
{s-base (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s-base)exit(0);s-top s-base;s-stackSizeSTACK_INIT_SIZE;
}void Push(sqStack *s,ElemType e)
{if(s-top - s-base s-stackSize){s-base(ElemType *)realloc(s-base,(s-stackSizeSTACKINCREMENT) * sizeof(ElemType));if(!s-base){exit(0);}}*(s-top)e;s-top;} void Pop(sqStack *s,ElemType *e)
{if(s-tops-base){return;}*e *--(s-top);
}int StackLen(sqStack s)
{return (s.top- s.base);
}int main(void)
{ElemType c;sqStack s;int len ,i,sum0;InitStack(s);printf(请输入二进制数输入#符号表示结束!);scanf(%c,c);while(c!#){Push(s,c);scanf(%c,c);}getchar();len StackLen(s);printf(栈的当前容量是%d\n,len);for(i0;ilen;i){Pop(s,c);sumsum(c-48)*pow(2,i);}printf(%d,sum);return 0;
}