栈
栈的链式存储就是线性表的链表
区别在于链表是任意位置都可以删除和插入,但是栈是只能一段插入和删除的,所以在链表的一段进行删除和插入就是栈的实现
顺序存储结构
//栈的顺序存储结构
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 5
typedef struct sqtack
{
int data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack& s)//初始化栈
{
s.top = -1;
}
bool testStack(SqStack& s)//判断栈是否为空
{
if (s.top == -1) return true;
else return false;
}
bool Push(SqStack& s)//入栈
{
for (int i = 0; i < 5; i++)
{
printf("请输入一个数字:");
int x;
scanf_s("%d",&x);
if (s.top == MaxSize - 1) return false;
else s.data[++s.top] = x;
}
return true;
}
bool Pop(SqStack& s, int &x)//出栈
{
if (s.top == -1)return false;
else {
x = s.data[s.top--];
}
return true;
}
bool GetTop(SqStack& s,int &i)//读栈顶元素
{
if (s.top == -1) return false;
else i = s.data[s.top];
return true;
}
void main()
{
SqStack s;
InitStack(s);//初始化一个栈
//判断栈是否是空栈
if (testStack(s))
{
printf("初始化完毕,栈为空\n");
}
//进栈
if (Push(s))
{
printf("入栈完毕\n");
}
int x,i;
//读取栈顶元素
if (GetTop(s, i))
{
printf("读栈成功,栈顶元素是:%d\n",i);
}
//出栈
if (Pop(s, x))
{
printf("出栈成功!\n");
}
}
链式存储
//栈的链式存储-带头节点
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode* next;
}*LinkList,Lnode;
//LinkList List_HeadInsert(LinkList& L)//头插法建立栈
//{
// L = (LinkList)malloc(sizeof(LinkList));
// L->next = NULL;
// Lnode* node;
// for (int i = 0; i < 5; i++)
// {
// printf("请输入一个数字:");
// int x;
// scanf_s("%d",&x);
// node = (Lnode*)malloc(sizeof(Lnode));
// node->data = x;
// node->next = L->next;
// L->next = node;
// }
// node->next = NULL;
// return L;
//}
LinkList List_Taillnert(LinkList& L)//尾插法建立栈
{
L = (LinkList)malloc(sizeof(LinkList));
L->next = NULL;
Lnode* node,*a=L;//*a是指向前驱的指针
for (int i = 0; i < 5; i++)
{
printf("请输入一个数字:");
int x;
scanf_s("%d",&x);
node = (Lnode*)malloc(sizeof(Lnode));
node->data = x;
a->next = node;
a = node;
}
node->next = NULL;
return L;
}
LinkList List_Delete(LinkList& L)
{
int i;
Lnode* node=L->next;
i= node->data;
L->next = node->next;
free(node);
return L;
}
void List_GetElem(LinkList& L,int &x)
{
Lnode* node = L;
x = node->next->data;
}
void put(LinkList& L)
{
LinkList b =L;
for(int i=0;i<5;i++)
{
printf("%d",b->next->data);
b = b->next;
}
}
void main()
{
LinkList L;
//List_HeadInsert(L);//头插法建立栈
List_Taillnert(L);//尾插法建立栈
List_Delete(L);//删除最上方元素在栈
int x;
List_GetElem(L,x);//查找最上方栈的元素
printf("最上面的元素是:%d\n",x);
put(L);
}