三 栈
1.定义
只允许在一端进行插入操作或删除的线性表。
-
重要术语
- 栈顶:允许 插入和删除的一端。
- 栈底:不允许 插入删除的一端。
- 空栈:不含任何元素的空表。
-
出栈顺序(卡特兰数):
n个不同元素进栈,出栈元素不同排列的个数:
1 n + 1 C 2 n n \frac{1}{n+1} \quad C_{2n}^n n+11C2nn
2.基本操作
#include<stdio.h>
#define MaxSize 10
#define ElemType int
//定义
typedef struct {
ElemType data[MaxSize];//静态数组存放栈中元素
int top;//栈顶指针
}SqStack;
//初始化
void InitStack(SqStack& S)
{
S.top = -1;//初始化栈顶指针
}
//判断栈空
bool StackEmpty(SqStack S)
{
if (S.top == -1)
return true;
else
return false;
}
//新元素入栈
bool Push(SqStack& S, ElemType x)
{
//栈满报错
if (S.top == MaxSize - 1)
{
return false;
}
S.data[++S.top] = x;//新元素入栈
return true;
}
//出栈操作
bool Pop(SqStack& S, ElemType& x)
{
//栈空,报错
if (S.top == -1)return false;
x = S.data[S.top--];//出栈
return true;
}
//读栈顶元素
bool GetTop(SqStack S, ElemType& x)
{
if (S.top == -1)return false;
//记录栈顶元素
x = S.data[S.top];
return true;
}
int main()
{
SqStack S;
InitStack(S);
for (int i = 0; i < 10; i++)
{
printf("入栈元素:%d ", i);
Push(S, i);
}
printf("入栈结束!\n\n");
int x;
for (int i = 0; i < 5; i++)
{
Pop(S, x);
printf("出栈元素:%d ", x);
}
printf("出栈结束!\n\n");
if (!StackEmpty(S))
{
GetTop(S, x);
printf("栈顶元素:%d\n", x);
}
return 0;
}
3.共享栈
-
定义
两个栈共享一片内存区域。
一个栈将数组开头作为栈顶,另一个将数组末尾作为栈顶。
typedef struct{ ElemType data[MaxSize];//静态数组存放栈中元素 int top0;//0号栈栈顶指针 int top1;//1号栈栈顶指针 } //初始化 void InitStack(ShStack &S){ S.top0=-1;//初始化栈顶指针 S.top1=MaxSize; }
-
栈满条件
top0+1==top1;
4.链栈
-
定义
采用链式存储的栈。
-
优点
便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。
-
实现文章来源:https://www.toymoban.com/news/detail-510065.html
用单链表实现,且规定所有操作只能在单链表表头实现。文章来源地址https://www.toymoban.com/news/detail-510065.html
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ElemType int
typedef struct Linknode {
ElemType data;//数据域
struct Linknode* next;//指针域
}LSnode,*LiStack;//栈类型定义
//初始化
//不带头结点
bool InitList(LiStack& S)
{
S = NULL;
return true;
}
//判空
bool isEmpty(LiStack &S)
{
if (S == NULL)
{
return true;
}
else
{
return false;
}
}
//随机创建栈
bool Stack_Creat(LiStack& S)
{
LSnode* t;
int n = 10;
srand(time(0));
while (n--)
{
t = (LSnode*)malloc(sizeof(LSnode));
t->data = rand() % 100 + 1;
if (isEmpty(S))
{
t->next = NULL;
S = t;//t作为头结点
}
else
{
t->next = S;
S = t;
}
}
return true;
}
//入栈
//插入数据为新栈顶元素
bool Stack_Push(LiStack& S, ElemType x)
{
LSnode* t;
t = (LSnode*)malloc(sizeof(LSnode));
t->data = x;
t->next = S;
S = t;
return true;
}
//出栈
bool Stack_Pop(LiStack& S, ElemType& x)
{
x = S->data;
S = S->next;
return true;
}
//读栈顶元素
bool Stack_Top(LiStack& S, ElemType& x)
{
x = S->data;
return true;
}
void Stack_Print(LiStack& S)
{
LiStack t = S;
while (t->next != NULL)
{
printf("%d,", t->data);
t = t->next;
}
printf("%d\n", t->data);
}
int main()
{
LiStack S;
InitList(S);
printf("创建栈:\n");
Stack_Creat(S);
Stack_Print(S);
printf("\n");
int x;
printf("请输入要添加的元素:");
scanf_s("%d", &x);
Stack_Push(S, x);
Stack_Print(S);
printf("\n");
int y;
Stack_Pop(S, y);
printf("出栈元素:%d\n", y);
Stack_Print(S);
printf("\n");
int z;
Stack_Top(S, z);
printf("栈顶元素:%d\n", z);
}
到了这里,关于【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!