链式栈

链式栈

//
//Description:链式栈
//
#include <iostream>
#include <malloc.h>

using namespace std;

typedef  int  ElemType;
typedef  int  Status;

//--------链式栈定义--------
typedef struct Stack
{
	ElemType data;
	struct Stack *next;
}Stack, *LinkStack;

Stack  *p=NULL;

static  int i = 0;//--------
//---------------创建链表-----------------------
void CreateList_LS(LinkStack &LS, int n)
{
	LS = (LinkStack)malloc(sizeof(Stack));
	LS->next = NULL;

	for (int i = 1; i <= n; i++)
	{
		p = (LinkStack)malloc(sizeof(Stack));
		cout << "\n请输入第" << i << "个链式栈结点的值\t";
		cin >> (p->data);
		p->next = LS->next;
		LS->next = p;
	}

}

//---------链式栈中查找栈顶结点的值------------
Status GetTop(LinkStack &LS, ElemType &e)
{
	if (LS->next == NULL)
	{
		cout << "目前为空栈,无栈顶元素!" << endl;
		return 0;
	}
	e = LS->next->data;
	cout << "\n\n当前栈顶元素为" << e << endl;

	return 1;
}

//向栈顶插入一个元素
Status Push(LinkStack &LS, ElemType e)
{
	p = (LinkStack)malloc(sizeof(Stack));
	p->data = e;
	if (LS->next == NULL)
	{
		cout << "尚未执行插入操作前为一个空栈!" << endl;
	}
	else
	{
		p->next = LS->next;

		LS->next = p;

	}

	return 1;

}

//删除栈顶元素
Status Pop(LinkStack &LS, ElemType &e)
{
	i++;
	if (LS->next == NULL)
	{
		cout << "目前为空栈,无法执行删除栈顶元素的操作!" << endl;
		return 0;
	}
	else
	{
		e = LS->next->data;
		LS->next = LS->next->next; //*(想想为什么不能写为  LS->next=p->next; )第一次执行删除操作时存在p,以后再进行删除操作时就可能不存在p了。

		cout << "\n刚才所删除的结点其值为" << e << endl;
		if (i == 1)
		{
			free(p);
		}//-----*********重要!!!***************------------
		return 1;
	}
}

//检测该链式栈是否完全正确,通过不断地删除栈顶元素和获取栈顶元素
void Check_RightOrNot(LinkStack &LS)
{
	cout << "\n以下为  快速验证链式栈是否完全正确 的操作\n" << endl;
	int ran;
	while (LS->next != NULL)
	{
		Pop(LS, ran);
		GetTop(LS, ran);
	}
}
void main()
{
	cout << "\n\t====================链式栈==================" << endl;
	int num;
	cout << "请输入初始时链式线性表中结点的个数" << endl;
	cin >> num;
	LinkStack LS;
	CreateList_LS(LS, num);
	ElemType value;
	GetTop(LS, value);
	cout << "\n请输入一个欲插入的" << "链式栈结点的值\t";
	cin >> value;
	Push(LS, value); GetTop(LS, value);
	Pop(LS, value); GetTop(LS, value);
	Check_RightOrNot(LS);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值