关于堆栈

堆栈是一种后进先出的数据结构,当你从堆栈中取出一个元素的时候,你得到的是最后进入堆栈的那个元素。堆栈这种数据结构特别适用于那些由多层子任务构成的任务。

堆栈比较常见的用法有1)保存子例程中的返回地址,参数,局部变量。2)用编译器分析语法时保存各种语法元素记号。

动态数组与链表的主要区别为其随机存取性,但因为堆栈上的操作永远集中在数据元素的尾部,所以使用动态数组体现不出它的优势。随着元素的增加,动态数组的大小总要随之调整,这是一种很费时的操作。

typedef struct elementT{
	struct elementT *next;
	void *data;
}element;

int Push(element **stack,void *data);
int Pop(element **stack,void **data);
int CreateStack(element **stack)
{
	*stack=NULL;
	return 1;
}
//不带头结点
int Push(element **stack,void *data)
{
	element *elem;
	elem=(element *)malloc(sizeof(element));
	if(!elem)
		return 0; //这点非常重要
	elem->data=data;
	elem->next=*stack;
	*stack=elem;
	return 1;
}

int Pop(element **stack,void **data)
{
	element *elem;
	if(!(elem=*stack))
		return 0;
	*data=elem->data;
	*stack=elem->next;
	free(elem);
	return 1;
}
int deleteStack(element **stack)
{
	element *elem;
	while(*stack)
	{
		elem=(*stack)->next;
		free(*stack);
		*stack=elem;
	}
	return 1;
}

构造的栈类

class Stack
{
public:
	Stack();
	~Stack();
	void Push(void *data);
	void *Pop();
protected:
	typedef struct elementT{
		struct elementT *next;
		void *data;
	}element;
	element *firstE1;
};

Stack::Stack(){
	firstE1=NULL;
	return;
}
Stack::~Stack(){
	element *elem;
	while(firstE1){
		elem=firstE1->next;
		delete firstE1;
		firstE1=elem;
	}
	return ;
}

void Stack::Push(void *data)
{
	element *elem=new element;
	elem->data=data;
	elem->next=firstE1;
	firstE1=elem;
	return;
}

void *Stack::Pop()
{
	element *popElem=firstE1;
	void *data;
	if(!firstE1)
		throw StackError(E_EMPTY);
	data=firstE1->data;
	firstE1=firstE1->next;
	delete popElem;
	return data;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值