堆栈的一些问题

一.含义

         堆指先进先出,栈指先进后出。        

         对于堆栈有两种操作:

  • 进栈指令(PUSH):在栈中现有元素顶部添加一个元素,新加入的元素变为最顶端的元素。
  • 出栈指令(POP):取出栈顶元素,删除栈中的这个元素
  • PUSH:向堆栈中加入数据。POP:取出堆栈中的数据。

二.栈的顺序存储实现

1.栈顶

#include<bits/stdc++.h>
using namespace std;
#define MaxSize 100
struct SNode {
	int Date[MaxSize];
	int Top;
};
typedef SNode* stack;

2.生成空栈

Stack CreateStack()
{
	Stack S = (Stack)malloc(sizeof(struct SNode));
	S->Top = -1;
	return S;
}

3.入栈

void Push(stack a, int b) {
	if (a->Top == MaxSize - 1)
	{
		cout << "堆栈已满!\n";
		return;
	}
	else
	{
		a->Date[++(a->Top)]=b;
		return;
	}
}

4.出栈

int Pop(Stack a)
{
	if (a->Top == -1)
	{
		cout << "堆栈为空!\n";
		return -1;
	}
	else
		return (a->Date[(a->Top)--]);
}

5.栈内元素显示

void Display(Stack a) {
	cout << a->Data[(a->Top)--];
	while ((a->Top) != -1)
		cout << " " << a->Data[(a->Top)--];
	cout << endl;
}//倒序输出

void Display1(Stack a) {
	cout << a->Data[0];
	for (int i = 1;i <= (a->Top);i++)
		cout << " " << a->Data[i];
	cout << endl;
}//正序输出

三.栈的链式存储实现

1.栈头

#include<bits/stdc++.h>
using namespace std;

struct SNode {
	int Data;
	struct SNode* Next;
};

typedef struct SNode* Stack;

2.生成空栈

Stack CreateStack()
{
	Stack S = (Stack)malloc(sizeof(struct SNode));
	//S->Data[0] = (int*)malloc(MaxSize * sizeof(int));
	S->Next = NULL;
	return S;
}

3.入栈

void Push(Stack a, int b) {
	Stack p;
	p = (Stack)malloc(sizeof(struct SNode));
	p->Data = b;
	p->Next = a->Next;
	a->Next = p;
}

4.出栈

int Pop(Stack a)
{
	Stack p;
	int pp;
	if (a->Next == NULL) {
		cout << "堆栈为空!\n";
		return NULL;
	}
	else
	{
		p = a->Next;
		pp = p->Data;
		a->Next = p->Next;
		free(p);
		return pp;
	}
}

5.栈内元素显示

void Display(Stack a) {
	Stack p = a->Next;
	if(p!= NULL)
		cout << p->Data;
	p = p->Next;
	while (p != NULL)
	{
		cout << " " << p->Data;
		p = p->Next;
	}
	cout << endl;
}

{(12条消息) 堆栈部分学习总结(栈的顺序存储实现、链式存储实现)_快乐小慧的博客-CSDN博客}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值