数据结构之栈与队列(一)

本文将讲解栈与队列,并以c语言和c++展示。

一.栈

1.1顺序栈
顺序栈简单来说,是一个有进出条件的数组而已。每个元素只能从尾插尾删。

首先,我们新定义一个类,名为SeqStack.
其中,我们需要定义一个数组,这里我选择了建立数组的头指针data,之后在初始化函数中再分配空间给它。同时我们需要一个变量top作为数组的下标,用它来完成相关操作。
同时,将我们将实现的函数进行函数声明。

#pragma once
#include<iostream>
using namespace std;

#define MAXSIZE 20

typedef class SeqStack
{
public:
	void StackInit();//初始化
	void StackPrint();//输出
	bool StackPush(int x);//入栈
	bool StackPop(int& value);//出栈
	bool StackGetTop(int& value);//查找栈顶元素
	bool StackIfEmpty();
private:
	int* data;
	int top;
}St;

接下来,我们要将这些功能依次实现。我将对函数逐个讲解。

  • 初始化函数
    我们先得给定义的数组分配空间,这里我才用了c++的方式
data = new int[MAXSIZE];

其中MAXSIZE是该数组的大小,由此可知,这是一个静态数组,不能改变其空间的大小,这也是顺序栈的缺陷。

然后,我们对top赋初值,很多同学觉得top赋值为0,但其是我觉得赋值为-1更好。

top = -1;

由此,初始化的代码为:

void St::StackInit()
{
	data = new int[MAXSIZE];
	top = -1;

}
  • 打印函数

这里没什么好讲的,利用循环遍历数组并打印即可。

void St::StackPrint()
{
	cout<<"栈长:"<<top + 1 << endl;
	if (top > -1)
	{
		int i = 0;
		for ( i = 0; i < top+1; i++)
		{
			cout<<data[i]<<",";
		}
		cout << endl;
	}
	
}
  • 入栈函数

对于入栈函数,我们要注意两个方面,
1.对是否栈满进行判断,若栈满直接返回false.
2.对于赋值与top++的顺序要注意,由于我们定义的top初值为-1,所以我们先对top加1,再对栈顶元素进行赋值。

bool St::StackPush(int x)
{
	if (top == MAXSIZE - 1)
		return false;
	top=top+1;
	data[top] = x;
	return true;
}
  • 出栈函数
    与入栈函数相同,在书写出栈函数时,我们也要判断栈是否为空,还有赋值与top–的先后顺序。
bool St::StackPop(int& value)
{
	if (top == -1)
		return -1;
	value = data[top];
	top--;
	return true;
}
  • 查找栈顶元素
  • 判空函数

这两个函数较简单,不过多赘述。

bool St::StackGetTop(int &value)
{
	if (top == -1)
		return false;
	value = data[top];
}
bool St::StackIfEmpty()
{
	if (top == -1)
		return true;
	else
		return false;
}
  • 函数的调用
#include"stack.h"

void StackTest()
{
	St s;
	s.StackInit();
	for (int j = 0; j < 20; j++)
	{
		s.StackPush(j + 1);
	}
	s.StackPrint();

	int keep;
	for (int j = 0; j < 10; j++)
	{
		s.StackPop(keep);
	}
	s.StackPrint();
	
}

int main()
{

	  StackTest();
	return 0;
}

链栈将在 数据结构之栈与队列(二)中讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ornamrr

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

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

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

打赏作者

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

抵扣说明:

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

余额充值