栈是一种重要的线性结构。
栈必须通过顺序表或者链表来实现。
栈是一个 先进后出 的线性表,它要求只在表尾进行数据的删除和插入等操作。
线性表有两种存储方式,即顺序表存储和链表存储。一般的栈都是用顺序表存储形式实现的,因此也叫顺序栈。
一、栈实例
利用栈的数据结构,将二进制数转换为十进制数。
#include <stdio.h>
#include <math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType; //将char定义为ElemType
typedef struct
{
ElemType *base; //指向栈底的指针变量
ElemType *top; //指向栈顶的指针变量
int stacksize;
}sqStack;
//创建一个栈
initStack(sqStack *s)
{
//内存中开辟一段连续空间作为栈空间,首地址直接赋给s->base
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s->base) exit(0); //分配空间失败
s->top = s->base; //最开始,栈顶就是栈底
s->stacksize = STACK_INIT_SIZE; //最大容量为STACK_INIT_SIZE
}
//入栈操作
Push(sqStack *s, ElemType e) //
{
if(s->top - s->base >= s->stacksize) //判断栈是否已满
{
//如果栈满,通过realloc()函数追加空间
s->base = (ElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(ElemType));
if(!s->base) exit(0); //存储空间分配失败
s->top = s->base + s->stacksize;
s->stacksize = s->stacksize + STACKINCREMENT; //设置栈的最大容量
}
*(s->top) = e; //放入数据
s->top++; //top指针自增1
}
//出栈操作
Pop(sqStack *s, ElemType *e)
{
if(s->top == s->base) return; //栈为空,程序返回
*e = *--(s->top); //将栈顶元素取出,同时top指针自减1
}
int stackLen(sqStack s) //计算二进制数的长度
{
return(s.top - s.base);
}
DestroyStack(sqStack *s)
{
free(s->base); //释放掉内存空间
s->base = s->top = NULL; //栈底栈顶指针置NULL
s->stacksize = 0; //设置栈的最大容量为0
}
//测试函数
int main ()
{
ElemType c;
sqStack s;
int len, i , sum = 0;
printf("Please input a Binary digit\n");
initStack(&s); //创建一个栈,用来存放二进制字符
//输入0/1字符表示二进制数,以#结束
scanf("%c",&c);
while(c!= '#')
{
Push(&s,c);
scanf("%c",&c);
}
getchar();
len = stackLen(s);//得到栈中的元素个数,即二进制数的长度
for(i=0; i<len; i++)
{
Pop(&s,&c);
sum = sum +(c-48) * pow(2,i); // 转换为十进制
}
printf("Decimal is %d\n",sum);
DestroyStack(&s); //释放栈空间
getche();
return 0;
}
输出结果: