关于顺序栈的代码编写即解释

 

一,关于栈

我的理解就是一种具有特殊规定的数组结构的称呼(即先进后出,后进先出

eg:类似于生活中往箱子里面放衣服,如果想从箱子里拿衣服,只能拿最上面的一层,即最后放进去的(后进先出)

二,栈的结构体表示

结构体定义

struct Node
{
    int NodeNum[MaxSize];        //定义顺序栈大小
    int top;                     //栈顶顺序表位置
    int base;                    //栈底顺序表位置
    int MaxNode;                 //栈的大小
};

图解:

如图的a b c d分别代表空栈,满栈,出栈,入栈情况。

首先可以看出跟数组的储存几乎类似。

然后根据图中可以得出:

  1. 判断空栈的方法即为:top是否等于base
  2. 判断栈满方法即为:top减去base是否与MaxNode相等

顺序栈的定义:

Node* Init()                        //定义
{
	Node*S = new Node;
	S->base = S->top = 0;
	S->MaxNode = MaxSize;
	return S;
}

先开辟新的空间,然后将top和base都赋值为0;


顺序栈入栈:

void Push(Node &S,int a)                 //入栈
{
	if (S.top - S.base != S.MaxNode)      //当栈顶减去栈底不等于栈大小,即栈未满栈
	{
		S.NodeNum[S.top] =a;
		S.top++;         //栈顶元素加一
	}
}

先判断栈是否满了,若不满,将该数据存入到顺序栈中的top位,然后top++;


顺序栈出栈:

void Pop(Node &S)          //出栈
{
	int a;
	if (S.top != S.base)                 //当栈顶不等于栈底,即栈不为空
	{
		S.top--;         //栈顶元素减一
	}
}

先判断栈是否为空,若不空,将top--(此处出栈也没返回元素,或显示,可自行添加)


查看栈顶元素:

void ShowTop(Node *P)
{
	cout <<"栈顶元素为:"<< P->NodeNum[P->top - 1]<<endl;
}

因为top指向比栈顶元素多一位,所以栈顶元素位置即为top--

但是此处为什么要用top-1,因为top--的话栈顶位置也改变了,此处不需要改变栈顶位置,所以用top-1

(此处P->NodeNum[P->top - 1]*(P->NodeNum+P->top - 1)的值是一样的,

    可以自己理解一下这两句代码的含义)


关于栈的遍历:

void ShowAll(Node *P)
{
	cout << "栈的遍历结果:";
	Node *Q = Init();             //通过辅助栈进行遍历
	while (P->top != P->base)
	{
		Push(*Q, P->NodeNum[--P->top]);       //先将每一个数都存进辅助栈中
		cout << P->NodeNum[P->top]<<" ";
	}
	while (Q->top != Q->base)
	{
		Push(*P, Q->NodeNum[--Q->top]);       //再将辅助栈转入原栈中
	}
}

因为栈只能从头开始出,所以需要定义一个新的辅助栈来进行遍历

或者直接定义一个新的int a等于top,然后进行遍历(突然感觉上面方法有点蠢)

 

全部代码

#include<iostream>
using namespace std;

#define MaxSize 20

//顺序栈
struct Node
{
	int NodeNum[MaxSize];        //定义顺序栈大小
	int top;                     //栈顶顺序表位置
	int base;                    //栈底顺序表位置
	int MaxNode;                 //栈的大小
};

Node* Init()                        //定义
{
	Node*S = new Node;
	S->base = S->top = 0;
	S->MaxNode = MaxSize;
	return S;
}

void Push(Node &S,int a)                 //入栈
{
	if (S.top - S.base != S.MaxNode)      //当栈顶减去栈底不等于栈大小,即栈未满栈
	{
		S.NodeNum[S.top] =a;
		S.top++;         //栈顶元素加一
	}
}

void Pop(Node &S)          //出栈
{
	int a;
	if (S.top != S.base)                 //当栈顶不等于栈底,即栈不为空
	{
		S.top--;         //栈顶元素减一
	}
}

void ShowAll(Node *P)
{
	cout << "栈的遍历结果:";
	Node *Q = Init();             //通过辅助栈进行遍历
	while (P->top != P->base)
	{
		Push(*Q, P->NodeNum[--P->top]);       //先将每一个数都存进辅助栈中
		cout << P->NodeNum[P->top]<<" ";
	}
	while (Q->top != Q->base)
	{
		Push(*P, Q->NodeNum[--Q->top]);       //再将辅助栈转入原栈中
	}
}
void ShowTop(Node *P)
{
	cout <<"栈顶元素为:"<< P->NodeNum[P->top - 1]<<endl;
}
int main()
{
	Node *P = Init();
	int a = 10;
	Push(*P,a);
	ShowTop(P);
	Pop(*P);
	ShowAll(P);
	system("pause");
	return 0;
}

学了几个新的编辑功能,不知道大家感觉怎么样。

有什么意见欢迎下面评论,感谢支持

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章