C语言用栈顶和栈底指针实现栈的操作及用栈实现数值转换

栈是一种先进先出(FIFO)的数据结构。。废话不多说,直接贴代码

代码参考了小甲鱼的数据机构课程

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <windows.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10   //一次增加10的空间
#define ERROR 0
#define OK 1

typedef int Status;
typedef int Elemtype;
typedef struct Stack {
	Elemtype *top;
	Elemtype *base;
	int StackSize;
}*Sqstack;

//构建一个栈//
void InitStack(Sqstack s) {
	s->base = (Elemtype *)malloc(STACK_INIT_SIZE * sizeof(Elemtype));
	if (!s->base)
		exit(ERROR);
	s->top = s->base;
	s->StackSize = STACK_INIT_SIZE;
}

//入栈操作//
Status Push(Sqstack s, Elemtype e) {
	//将e的内容入栈
	//如栈满则追加空间
	if (s->top - s->base >= s->StackSize) {
		//两个地址相减实际上结果是地址差除以每个元素的地址值,也就是元素个数
		//这里实际上等于才是边界条件,因为我们的栈top指向空白的空间
		s->base = (Elemtype *)realloc(s->base, (s->StackSize + STACKINCREMENT) * sizeof(Sqstack));
		if (!s->base)
			exit(ERROR);
		s->top = s->base + s->StackSize;
		s->StackSize = s->StackSize + STACKINCREMENT;
	}
	*(s->top) = e;//将e放入内存空间
	s->top++;     //top继续加一,指向没使用的空间
	return OK;
}

//出栈操作//
Status Pop(Sqstack s, Elemtype *e) {
	//出栈之后将元素返回给e
	//判断栈是否为空栈
	if (s->top == s->base)
		//此时栈是空栈
		return ERROR;
	s->top--; //top先减一,指向有元素的内存单元
	*e = *(s->top);
	return OK;
}

//清空栈//
Status ClearStack(Sqstack s) {
	//实际上就是把头指针赋值给尾指针
	s->top = s->base;
	return OK;
}

//销毁一个栈//
Status DestoryStack(Sqstack s) {
	//销毁一个栈就是要清空栈的内存空间
	int i, len;
	len = s->StackSize;
	for (i = 0; i < len; i++) {
		free(s->base);
		s->base++;
	}
	s->base = s->top = NULL;
	s->StackSize = 0;
	return OK;
}

//栈内元素个数//
int Stacklen(Sqstack s) {
	return (s->top - s->base);
}

以上就是简单的栈的抽象数据类型,下面贴主函数来实现数值的转换

int main()
{
	Sqstack s = (Stack *)malloc(1 * sizeof(Sqstack));
	InitStack(s);
	int a[8] = { 1,1,0,0,1,0,0,1 };
	int b,c=0;//b用来存放结果,c用来存放十进制结果
	for (int i = 0; i < 8; i++) 
		//8次入栈操作
		Push(s, a[i]);
	for (int i = 0; i < 8; i++) {
		//8次出栈操作
		Pop(s, &b);//b就是出栈的数
		//二进制从最低位开始出来
		c += b * pow(2, i); 
	}
	printf("转换成十进制数:%d", c);
    return 0;
}

最后的运行结果:


PS:pow()函数有两个参数,第一个参数是底数,第二个参数是指数。。。返回的值应该是double型的,vs有给我double转换成int丢失精度的提醒。

猜你喜欢

转载自blog.csdn.net/haohulala/article/details/80041289