数据结构——栈的基本操作(二进制转十进制实例—c语言代码)

栈是一种重要的线性结构。栈必须通过线性表或者链表来实现,顺序表点击打开链接和链表点击打开链接既可以向之前介绍的那样独立存在,同时它们也是一些特殊的数据结构(栈,队列)的实现基础。

定义:栈是一个先进后出的线性表,只要求在表尾进行插入和删除等操作,这是栈相对于链表和顺序表的独特之处(对操作上有了一定的限制)。

这个末尾称为栈顶(top)  相应的表头称为栈底(bottom)

数据结构——栈的基本操作(二进制转十进制实例—c语言代码)_第1张图片



线性表的两种储存方式:顺序表和链表   一般栈用顺序表储存形式实现。

/********************************************
 *利用栈的数据结构,将二进制转换为十进制数
 *分析:从最低位开始,第i位*2的(i-1次),再累加
 *利用栈来实现:将一串二进制码从高到低顺序入栈
 *逐一从栈顶取出,每位乘积再累加 
 ********************************************/ 
#include
#include
#define STACK_INIT_SIZE 20
#define STACK_MENT 10
#include



/* 定义一个顺序栈sqStack */ 
typedef struct {
	int *base;            //指向栈底的指针
	int *top;             //指向栈顶的指针
	int stacksize;        //当前最大容量
}sqStack;		

/* 创建一个栈 1.开辟空间 2.栈顶和底的地址赋给指针变量
void initStack(sqStack *s)
{
	//内存中开辟一段连续的空间作为栈空间,首地址赋给 s->base 
	s->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
	if(!s->base)	exit(0);				//分配失败
	s->top = s->base;					//开始,栈顶就是栈底
	s->stacksize = STACK_INIT_SIZE;			        //最大容量为STACK_INIT_SIZE 
}

/******************** 
 *入栈(压栈) 
 *每插入一个元素
 *top指针+1,直到栈满
 *********************/
void Push(sqStack *s, int e)
{
	//判断栈满,追加空间 
	if(s->top - s->base >= s->stacksize)
	{
		s->base = (int *)realloc(s->base, (s->stacksize + STACK_MENT)*sizeof(int));
		if(!s->base)	exit(0);				//分配失败
		s->top = s->base + s->stacksize;						
		s->stacksize = s->stacksize + STACK_MENT;	//设置栈的最大容量 
	}
	*(s->top) = e;								//放入数据 
		s->top++;
} 
 
/******************** 
 *出栈 
 *每弹出一个元素 指针下移
 *直到空栈
 *********************/
void Pop(sqStack *s, int *e)
{
	if(s->top == s->base)	return;
	*e = *--(s->top);
}
//计算栈的当前容量 栈的大小s.stacksize与当前容量不是一个概念
int Stacklen(sqStack s)
{
	return(s.top - s.base);
}
/******************** 
 *测试函数 
 *********************/
int main()
{
	int x;
	sqStack s;
	int len, i, sum=0;
	printf("请输入01二进制数据,#结束:\n");
	initStack(&s);
	scanf("%d", &x);
	while(x != '9')
	{
		Push(&s, x);
		scanf("%d", &x);
	}
	getchar();
	len = Stacklen(s);
	
	for(i =0; i

你可能感兴趣的:(数据结构与算法)