栈: 是一个后进先出的线性表,他要求只在表尾进行删除和插入操作。
栈的要求: 1.元素必须后进先出
2.栈的操作只能在线性表的表尾进行
3.对于栈来说,表尾成为栈的栈顶,表头成为栈底
栈的插入和删除操作
1.栈的插入操作叫进栈,压栈,入栈
2.栈的删除操作叫做出栈,弹栈。
栈也是线性表,所以栈也有两种存储方式:
1.栈的顺序存储结构
2.栈的链式存储结构
//创建一个栈
typedef struct
{
ElemType *base;//栈底
ElemType *top;//栈顶
int stackSize//当前栈的可用容量
}sqStack;
#define STACK_INIT_SIZE 100
initStack(sqStack *s)
{
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s->base)
exit(0);
s->top = s->base;//刚开始栈底就是栈顶
s->stackSize = STACK_INIT_SIZE;
}
//入栈
#define SATCKINCREMENT 10
Push(sqStack *s, ElemType e)
{
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType *)realloc(s->base,(s->stackSize + SATCKINCREMENT) * sizeof(ElemType));
//realloc是重新分配内存函数
//指针名=(数据类型)realloc(要改变内存大小的指针
名,新的大小)。
if(!s->base)
exit(0);
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + SATCKINCREMENT;
}
*(s->top) = e;
s->top++;
//出栈操作
Pop(sqStack *s,ElemType *e)
{
if(s->top == s->base) //空栈
return ;
*e = *--(s->top);
//清空一个栈
ClearStack(sqStack *s)
{
s->top = s->base;
}
//销毁栈
DestyoyStack(sqStack *s)
{
int i, len;
len = s->stackSize;
for(i = 0; i < len; i++)
{
free(s->base);
}
s->base = s->top = NULL;
s->stackSize = 0 ;
//计算栈当前的容量
int StackLen(sqStack s)
{
return (s.top - s.base);
}
二进制转换为十进制: 从最低位起用每一位去乘以对应位的积也就是用第n位去乘以2^(n-1)
#include<stdio.h>
#include<srdlib.h>
#include<math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType;
//如果用int 则会把二进制数作为一个整体
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->stackSize = STACK_INIT_SIZE;
}
void Push(sqStack *s,ElemType e)
{
if(s->top - s->base >= s->stackSize)
{
s->base = (ElemType * )realloc(s->base,(s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !s->base )
exit(0);
}
*(s->top) = e;
s->top++;
}
void Pop(sqStack *s,ElemType *e)
{
if(s->top == s->base)
return;
*e = *--(s->top);
//因为s->top指向的结点为空,所以要使用--i,先减去再赋值具体图片请看图1.1
}
void StackLen(sqStack s)
{
return(s.top - s.base);
}
int main()
{
ElemType c;
sqStack s;
int len,i,sum = 0;
printf("请输入二进制数:输入#符号表示结束");
IninStack(&s);
scanf("%c",&c);
while(c != '#')
{
Push(&s , c);
scanf("%c",&c);
}
getchar();
len = StackLen(s);
printf("栈的当前容量是:%d\n",len);
for(i 0;i < len;i++)
{
Pop(&s,&c);
sum = sum + (c-48) * pow(2,i);
}
printf("转换为十进制数是:%d\n",sum)
return 0;
}
图1.1
这里定义结构得方法和书上不一样,书上用的是数组,因为数组是从0开始得,所以top就要从-1开始,所以当栈满时,top指向的最后一个元素。
但是这里用得时指针,所以就不存在这种情况了