0
点赞
收藏
分享

微信扫一扫

数据结构与算法-栈

在这里插入图片描述

🎈1.栈的定义

🎈2.栈的抽象数据类型

在这里插入图片描述

🎈3.顺序栈

🔭3.1顺序栈的类定义

#define InitStackSize 100
#define StackIncrement 10
typedef int SElemType;
class Sqstack
{
private:
	SElemType* base;//栈底指针,SElemType为栈中元素类型
	SElemType* top;//栈顶指针
	int stacksize;//栈容量
public:
	Sqstack();//构造函数,初始化建立一空栈
	~Sqstack()//析构函数,销毁栈
	{
		delete[]base;
		stacksize = 0;
	}
	SElemType GetTop();//取栈顶元素
	void Push(SElemType e);//进栈
	void Pop(SElemType& e);//退栈
	int EmptyStack();//判断栈空否,若空返回1,否则返回0
	void Print();//从栈底到栈顶输出栈中的元素
};

🔭3.2初始化建立空栈

Sqstack::Sqstack()
{
	base = top = new SElemType[InitStackSize];
	stacksize = InitStackSize;
}

🔭3.3入栈操作

void Sqstack::Push(SElemType e)
{
	if (top - base == stacksize)
	{
		SElemType* base1 = new SElemType[stacksize + StackIncrement];
		int i = 0;
		for (i = 0; i < InitStackSize; i++)
		{
			base1[i] = base[i];
		}
		delete[]base;//释放空间
		base = base1;
		top = base + stacksize;
		stacksize += StackIncrement;
	}
	*top++ = e;//插入e
}

🔭3.4退栈操作

void Sqstack::Pop(SElemType& e)
{
	if (top == base)//栈空,删除操作无法进行
		return;
	e = *top--;
}

🔭3.5栈判空操作

int Sqstack::EmptyStack()
{
	if (top == base)
		return 1;
	else
		return 0;
}

🔭3.6返回栈顶元素

SElemType Sqstack::GetTop()//返回栈顶元素
{
	return *(top - 1);
}

🔭3.7打印栈

void Sqstack::Print()//打印栈中元素
{
	int i = 0;
	for (i = 0; i < *(top - 2); i++)
	{
		cout << base[i] << " ";
	}
	cout << endl;
}

🔭3.8全部代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#define InitStackSize 100
#define StackIncrement 10
typedef int SElemType;
class Sqstack
{
private:
	SElemType* base;//栈底指针,SElemType为栈中元素类型
	SElemType* top;//栈顶指针
	int stacksize;//栈容量
public:
	Sqstack();//构造函数,初始化建立一空栈
	~Sqstack()//析构函数,销毁栈
	{
		delete[]base;
		stacksize = 0;
	}
	SElemType GetTop();//取栈顶元素
	void Push(SElemType e);//进栈
	void Pop();//退栈
	int EmptyStack();//判断栈空否,若空返回1,否则返回0
	void Print();//从栈底到栈顶输出栈中的元素
};
Sqstack::Sqstack()
{
	base = top = new SElemType[InitStackSize];
	stacksize = InitStackSize;
}
void Sqstack::Push(SElemType e)
{
	if (top - base == stacksize)
	{
		SElemType* base1 = new SElemType[stacksize + StackIncrement];
		int i = 0;
		for (i = 0; i < InitStackSize; i++)
		{
			base1[i] = base[i];
		}
		delete[]base;//释放空间
		base = base1;
		top = base + stacksize;
		stacksize += StackIncrement;
	}
	*top++ = e;//插入e
}
void Sqstack::Pop()
{
	SElemType e;
	if (top == base)//栈空,删除操作无法进行
		return;
	e = *top--;
}
int Sqstack::EmptyStack()//判空函数
{
	if (top == base)
		return 1;
	else
		return 0;
}
SElemType Sqstack::GetTop()//返回栈顶元素
{
	cout << *(top - 1) << endl;
	return 0;
}
void Sqstack::Print()//打印栈中元素
{
	int i = 0;
	for (i = 0; i < *(top - 2); i++)
	{
		cout << base[i] << " ";
	}
	cout << endl;
}
int main()
{
	Sqstack l;
	l.Push(3);
	l.Push(5);
	l.Push(6);
	l.Pop();
	l.GetTop();
	l.Print();
	return 0;
}

✅调试运行:
在这里插入图片描述

🎈4.链栈

🔭4.1链栈的类定义

typedef int SElemType;
typedef struct LinkNode
{
	SElemType data;
	LinkNode* next;
}LinkNode;
class LinkStack
{
private:
	LinkNode* top;//栈顶指针即链栈的头指针
public:
	LinkStack();//构造函数,置空链栈
	~LinkStack();//析构函数,释放链栈中各结点的存储空间
	SElemType GetTop();//获取栈顶元素
	void Push(SElemType e);//将元素e入栈
	void Pop(SElemType& e);//将栈顶元素出栈
	int EmptyStack();//判断链栈是否为空栈
};

🔭4.2创建空栈

LinkStack::LinkStack()
{
	top = new LinkNode;
	top->next = NULL;
}

🔭4.3销毁栈

LinkStack::~LinkStack()//析构函数,释放链栈中各结点的存储空间
{
	LinkNode* p = top;
	LinkNode* q = top->next;
	while (q)
	{
		delete p;
		p = q;
		q = q->next;
	}
	delete p;//删除最后一个结点
}

🔭4.4入栈操作

void LinkStack::Push(SElemType e)
{
	LinkNode* s = new LinkNode;//分配空间
	s->data = e;
	s->next = top->next;//插入元素e
	top->next = s;
}

🔭4.5退栈操作

void LinkStack::Pop(SElemType& e)
{
	if (top->next == NULL)
		return;
	LinkNode* p = top->next;//p指向首元结点
	e = p->data;
	top->next = p->next;//删除首元结点
	delete p;
}

🔭4.6判空操作

int LinkStack::EmptyStack()
{
	if (top->next == NULL)
		return 1;
	else 
		return 0;//栈非空返回0
}

🔭4.7返回栈顶元素

SElemType LinkStack::GetTop()
{
	return top->next->data;
}

🔭4.8打印栈

void LinkStack::print()
{
	LinkNode* p = top->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

🔭4.9全部代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
typedef int SElemType;
typedef struct LinkNode
{
	SElemType data;
	LinkNode* next;
}LinkNode;
class LinkStack
{
private:
	LinkNode* top;//栈顶指针即链栈的头指针
public:
	LinkStack();//构造函数,置空链栈
	~LinkStack();//析构函数,释放链栈中各结点的存储空间
	SElemType GetTop();//获取栈顶元素
	void Push(SElemType e);//将元素e入栈
	void Pop();//将栈顶元素出栈
	int EmptyStack();//判断链栈是否为空栈
	void print();//打印栈
};
LinkStack::LinkStack()//构造函数,置空链栈
{
	top = new LinkNode;
	top->next = NULL;
}
LinkStack::~LinkStack()//析构函数,释放链栈中各结点的存储空间
{
	LinkNode* p = top;
	LinkNode* q = top->next;
	while (q)
	{
		delete p;
		p = q;
		q = q->next;
	}
	delete p;//删除最后一个结点
}
void LinkStack::Push(SElemType e)
{
	LinkNode* s = new LinkNode;//分配空间
	s->data = e;
	s->next = top->next;//插入元素e
	top->next = s;
}
void LinkStack::Pop()
{
	SElemType e;
	if (top->next == NULL)
		return;
	LinkNode* p = top->next;//p指向首元结点
	e = p->data;
	top->next = p->next;//删除首元结点
	delete p;
}
int LinkStack::EmptyStack()
{
	if (top->next == NULL)
		return 1;
	else 
		return 0;//栈非空返回0
}
SElemType LinkStack::GetTop()
{
	cout << top->next->data << endl;
	return 0;
}
void LinkStack::print()
{
	LinkNode* p = top->next;
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
int main()
{
	LinkStack l;
	l.Push(1);
	l.Push(2);
	l.Push(3);
	l.Push(4);
	l.Push(5);
	l.GetTop();
	l.Pop();
	l.print();
}

✅运行示例:
在这里插入图片描述

举报

相关推荐

0 条评论