顺序栈的创建、入栈、出栈:
堆栈——顺序栈的创建、入栈、出栈_f-f-g的博客-CSDN博客
//堆栈的链式存储
//带头结点的链栈
#include<stdio.h>
#include<stdlib.h>
#include <stdbool.h>
typedef int ElementType;
typedef struct SNode * PtrToSNode;
struct SNode{
ElementType Data;//结点元素
PtrToSNode Next;//指向下一结点
};
typedef PtrToSNode Stack;
//1.创建
Stack CreateStack()
{
//构建一个堆栈的头结点,返回该结点指针
Stack S;
S=(Stack)malloc(sizeof(struct SNode));
S->Next =NULL;
return S;
}
//2.入栈Push
/*
链栈通常不会出现满栈的情况
链栈以链表方式储存信息 而链表的节点一般都是以动态分配内存
这样 如果在没有其他限制情况下 只有动态申请内存失败的时候才算是栈满
*/
bool Push(Stack S,ElementType X)
{
PtrToSNode TmpCell;
TmpCell=(PtrToSNode)malloc(sizeof(struct SNode));
TmpCell->Data =X;
//插入头结点后(带头结点)
TmpCell->Next =S->Next ;
S->Next =TmpCell;
return true;
}
//3.出栈Pop
//判断堆栈是否为空
bool IsEmpty(Stack S)
{
//为空则返回true
return (S->Next ==NULL);
}
#define ERROR -1 //ERROR为链栈不可能取到的值
ElementType Pop(Stack S)
{
//删除并返回堆栈S的栈顶元素
PtrToSNode FirstCell;
ElementType TopElem;
if(IsEmpty(S)){
printf("堆栈空\n");
return ERROR;
}else{
FirstCell=S->Next ;
TopElem=FirstCell->Data ;
S->Next =FirstCell->Next ;
free(FirstCell);
return TopElem;
}
}
int main()
{
Stack S=CreateStack();
int i;
//输入数据
printf("请输入链表结点个数:\n");
int n;
scanf("%d",&n);
ElementType X,p;
printf("入栈:");
for(i=0;i<n;i++){
scanf("%d",&X);
Push(S,X);
}
printf("\n");
printf("出栈: ");
for(i=0;i<n;i++){
p=Pop(S);
printf("%d ",p);
}
return 0;
}
运行: