本文将讲解栈与队列,并以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;
}
链栈将在 数据结构之栈与队列(二)中讲解。