第二章线性表文章跳转链接
数据结构-线性表(一)概念及基本操作
下篇文章
数据结构-栈和队列(二)队列
数据结构-栈和队列(三)栈和队列的应用
本文详细介绍了栈的基本概念和基本操作;以及顺序栈和链式栈的实现代码。Let’s go!♂️
栈(Stack) 是只允许在一端进行插入或删除操作的线性表
线性表基本操作
InitList(&L): 初始化表。构造一个空的线性表L,分配内存空间。
DestroyList(&L): 销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
ListInsert(&L,i,e): 插入操作。在表L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e): 删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
LocateElem(L,e): 按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem(L,i): 按位查找操作。获取表L中第i个位置的元素的值。
其他常用操作:
Length(L): 求表长。返回线性表L的长度,即L中数据元素的个数。
PrintList(L): 输出操作。按前后顺序输出线性表L的所有元素值。
Empty(L): 判空操作。若L为空表,则返回true,否则返回false。
栈的基本操作
InitStack(&S): 初始化栈。构造一个空栈 S,分配内存空间。
DestroyStack(&S):销毁栈。销毁并释放栈 S 所占用的内存空间。
Push(&S,x): 进栈,若栈S未满,则将x加入使之成为新栈顶。
Pop(&S,&x): 出栈,若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x): 读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素
其他常用操作:
StackEmpty(S): 判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。
#include
#include
#include
#include
#define MaxSize 10
using namespace std;
typedef struct{
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
/**
* @description: 初始化栈
* @param {SqStack} &S
* @return {*}
*/
void initStack(SqStack &S) {
S.top = -1; //初始化栈顶指针
}
/**
* @description: 判断栈是否空
* @param {SqStack} S
* @return {*}
*/
bool isEmpty(SqStack S) {
return S.top == -1;
}
/**
* @description: 判断栈是否满
* @param {SqStack} S
* @return {*}
*/
bool isFull(SqStack S) {
return S.top == MaxSize - 1;
}
/**
* @description: 入栈
* @param {SqStack} &S
* @param {int} e
* @return {*}
*/
bool Push(SqStack &S, int e) {
if (isFull(S))
return false;
S.top++; //指针加一
S.data[S.top] = e; //入栈
return true;
}
/**
* @description: 出栈
* @param {SqStack} &S
* @param {int} &e
* @return {*}
*/
bool Pop(SqStack &S, int &e) {
if(isEmpty(S))
return false;
e = S.data[S.top];
S.top--;
return true;
}
/**
* @description: 取栈顶元素
* @param {SqStack} S
* @return {*}
*/
int GetTop(SqStack S) {
if(isEmpty(S))
return false;
return S.data[S.top];
}
/**
* @description: 输出栈
* @param {SqStack} S
* @return {*}
*/
void printStack(SqStack S) {
if(isEmpty(S))
return;
for(int i = S.top; i >= 0; i--)
cout << "stack[" << i << "] = " << S.data[i] <<endl;
}
int main() {
SqStack S; //初始化
initStack(S);
bool loop = true;
while (loop)
{
system("pause");
system("cls");
cout << "欢迎进行栈的操作,请按指定序号操作,考研顺利!" << endl;
cout << "---------------------菜单---------------------" << endl;
cout << "1、入栈" << endl;
cout << "2、出栈" << endl;
cout << "3、输出栈" << endl;
cout << "4、查看栈顶元素" << endl;
cout << "0、退出" << endl;
int num;
cout << "请选择序号:" ;
cin >> num;
switch (num)
{
case 1:
if (isFull(S)) {
cout << "栈满" << endl;
} else {
int e;
cout << "请输入数据:" ;
cin >> e;
Push(S, e);
}
break;
case 2:
if (isEmpty(S))
{
cout << "栈空" << endl;
}
else
{
int e = -1;
Pop(S, e);
cout << "出栈的数据为:" << e << endl;
}
break;
case 3:
if(isEmpty(S))
cout << "栈空" << endl;
else
printStack(S);
break;
case 4:
if (isEmpty(S))
{
cout << "栈空" << endl;
}else {
cout << "栈顶的数据为: " << GetTop(S) << endl;
}
break;
case 0:
loop = false;
break;
case 6:
break;
default:
break;
}
}
return 0;
}
#include
#include
#include
using namespace std;
typedef struct LinkNode {
int data;
int length;
LinkNode *next;
}*LinkStack;
/**
* @description: 初始化栈
* @param {LinkStack} &S
* @return {*}
*/
bool initStack(LinkStack &S)
{
// LinkStack *L; //初始化栈顶指针
S = (LinkNode *)malloc(sizeof(LinkNode));
if(S == NULL)
return false;
S->next = NULL;
S->length = 0;
return true;
}
/**
* @description: 判断栈是否空
* @param {LinkStack} S
* @return {*}
*/
bool isEmpty(LinkStack S)
{
return S->next == NULL;
}
/**
* @description: 入栈 -- 头插法
* @param {LinkStack} &S
* @param {int} e
* @return {*}
*/
bool Push(LinkStack &S, int e)
{
LinkNode *t;
t = (LinkNode *)malloc(sizeof(LinkNode));
t->data = e;
if(isEmpty(S))
t->length = 1;
else
t->length = S->next->length + 1;
t->next = S->next;
S->next = t;
return true;
}
/**
* @description: 出栈
* @param {LinkStack} &S
* @param {int} &e
* @return {*}
*/
bool Pop(LinkStack &S, int &e)
{
if (isEmpty(S))
return false;
LinkNode *p = S->next;
e = p->data;
S->next = p->next;
free(p);
return true;
}
/**
* @description: 取栈顶元素
* @param {LinkStack} S
* @return {*}
*/
int GetTop(LinkStack S)
{
if (isEmpty(S))
return false;
return S->next->data;
}
/**
* @description: 输出栈
* @param {LinkStack} S
* @return {*}
*/
void printStack(LinkStack S)
{
if (isEmpty(S))
return;
LinkNode *t = S->next;
while(t != NULL) {
cout << "stack [" << t->length << "] = " << t->data << endl;
t = t->next;
}
}
/**
* @description: 获取链长
* @param {LinkStack} S
* @return {*}
*/
int GetLength(LinkStack S) {
if(isEmpty(S))
return 0;
else
return S->next->length;
}
int main()
{
LinkStack S; //初始化
initStack(S);
bool loop = true;
while (loop)
{
cout << "\n" << endl;
system("pause");
system("cls");
cout << "欢迎进行栈的操作,请按指定序号操作,考研顺利!" << endl;
cout << "---------------------菜单---------------------" << endl;
cout << "1、入栈" << endl;
cout << "2、出栈" << endl;
cout << "3、输出栈" << endl;
cout << "4、查看栈顶元素" << endl;
cout << "5、查看链长" << endl;
cout << "0、退出" << endl;
int num;
cout << "请选择序号:";
cin >> num;
switch (num)
{
case 1:
int e;
cout << "请输入数据:";
cin >> e;
Push(S, e);
break;
case 2:
if (isEmpty(S))
{
cout << "栈空" << endl;
}
else
{
int e = -1;
Pop(S, e);
cout << "出栈的数据为:" << e << endl;
}
break;
case 3:
if (isEmpty(S))
cout << "栈空" << endl;
else
printStack(S);
break;
case 4:
if (isEmpty(S))
{
cout << "栈空" << endl;
}
else
{
cout << "栈顶的数据为: " << GetTop(S) << endl;
}
break;
case 5:
cout << "链长为:" << GetLength(S) << endl;
break;
case 0:
loop = false;
break;
default:
break;
}
}
return 0;
}
新的一章开启!加油
下篇文章-数据结构-栈和队列(二)队列
数据结构-栈和队列(二)队列♂️