数据结构之栈结构

简单实现栈结构

#include <iostream>
#include <string>
#include <cstdlib>
#define MAX_SIZE 100		//定义栈的初始化个数
#define CREATESIZE 10		//定义栈的扩容个数

using namespace std;

typedef int ElemType;		//定义栈的数据元素类型

//定义栈结构
typedef struct Stack
{
	ElemType* top;			//栈顶
	ElemType* base;			//栈底
	int stackSize;			//当前栈的最大容量
}Stack;

//初始化栈
string InitStack(Stack& stack);
//获取栈中元素的个数
int GetLength(Stack stack);
//入栈(压栈)
string PushStack(Stack& stack,ElemType e);
//获取栈顶的元素
ElemType GetTopElem(Stack stack);
//元素出栈
ElemType PopStack(Stack& stack);
//输出栈中所有元素
void ShowStack(Stack stack);

int main()
{
	/** 十进制转二进制测试 */
	Stack stack;
	InitStack(stack);
	int a;
	cin >> a;
	while (a)
	{
		PushStack(stack, a % 2);
		a /= 2;
	}
	ShowStack(stack);
	system("pause");
	return 0;
}

//初始化栈
string InitStack(Stack& stack)
{
	//为栈分配空间
	stack.base = (ElemType*)malloc(sizeof(ElemType) * MAX_SIZE);
	//栈分配空间失败
	if (!stack.base)
	{
		return "erro";
	}
	//将栈顶和栈底指向同一块内存空间
	stack.top = stack.base;
	//初始化栈的最大容量
	stack.stackSize = MAX_SIZE;
	return "OK";
}

//获取栈中元素的个数
int GetLength(Stack stack)
{
	return (stack.top - stack.base);
}

/**
*	入栈(压栈)  
*	注意事项:判断栈中元素是否已满
*/
string PushStack(Stack& stack,ElemType e)
{
	//栈的空间不够(元素个数多于100个),对栈进行扩容
	if ((stack.top- stack.base) > stack.stackSize)
	{
		//为栈分配扩容空间
		stack.base = (ElemType*)realloc(stack.base,sizeof(ElemType) * CREATESIZE);
		//扩容失败,退出程序
		if (!stack.base)
		{
			return "erro";
		}
		//将栈顶指针指向栈顶(栈底加上栈的元素个数)
		stack.top = stack.base + stack.stackSize;
		//将栈的容量进行更新(加上新扩容的空间)
		stack.stackSize += CREATESIZE;
	}
	*(stack.top) = e;
	stack.top++;
	return "OK";
}

/**
*	获取栈顶的元素
*	注意事项:判断是否为空栈
*/
ElemType GetTopElem(Stack stack)
{
	//空栈的情况
	if (stack.top == stack.base)
	{
		cout << "栈为空" << endl;
		exit(1);
	}
	//返回栈顶元素
	return *(--stack.top);
}

/**
*	元素出栈
*	注意事项:是否为空栈
*/
ElemType PopStack(Stack& stack)
{
	if (stack.top == stack.base)
	{
		cout << "栈为空" << endl;
		exit(1);
	}
	return *(--stack.top);
}

//输出栈中所有元素
void ShowStack(Stack stack)
{
	while (stack.top != stack.base)
	{
		cout << *(--stack.top) << "  ";
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道人禅(armey)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值