用C语言实现栈的链式表示,即链栈,链栈与顺序栈的一点不同在于链栈几乎不存在栈满的情况,动态分配栈的存储空间,更加灵活。链栈是一种受限的链表。
#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 100;
#define OK 1;
#define ERROR 0;
#define OVERFLOW 0;
#define TURE 1;
#define FALSE 0;
typedef int Status;
typedef char SElemType; //栈型数据
//链栈定义
typedef struct StackNode {
SElemType data; //数据域
struct StackNode *next; //指针域
}StackNode,*LinkStack;
/**
* 链栈结构:stack1(栈顶)->node2->node3->...->nodeN(栈底)
**/
//链栈初始化
Status InitStack(LinkStack *stack){
//构造一个空栈,栈顶指针置为空
*stack=NULL;
return OK;
}
//判断链栈是否为空
Status StackIsEmpty(LinkStack stack){
if(stack==NULL){
return TURE;
} else {
return FALSE;
}
}
//元素进入链栈
Status Push(LinkStack *stack,SElemType elem){
StackNode *newNode; //定义指向新结点指针
newNode=(StackNode*)malloc(sizeof(StackNode)); //新节点分配空间
newNode->data=elem; //新结点数据域赋值
newNode->next=(*stack); //新结点指针域指向原栈顶
(*stack)=newNode; //更新栈顶
return OK;
}
//顺序栈的出栈操作
Status Pop(LinkStack *stack,SElemType *elem){
StackNode *waitDeleted; //定义指向待出栈结点指针
waitDeleted=(*stack); //栈顶结点
*elem=waitDeleted->data; //elem存放出栈元素值
(*stack)=(*stack)->next; //更新栈顶指针
free(waitDeleted); //释放已出栈的结点空间
return OK;
}
//取栈顶元素
SElemType GetTop(LinkStack stack){
if(stack!=NULL){
return stack->data;
} else {
SElemType null;
return null;
}
}
int main(void){
LinkStack stack1; //用指针stack1表示一个链栈
//初始化
Status initStackResult = InitStack(&stack1);
printf("栈stack1初始化结果码:%d\n",initStackResult);
//是否为空
Status stackIsEmpty = StackIsEmpty(stack1);
printf("栈stack1为空?:%d\n",stackIsEmpty);
//元素入栈
SElemType elem1='Y',elem2='C';
Status pushResult = Push(&stack1,elem1);
printf("入栈执行结果:%d\n",pushResult);
Push(&stack1,elem2); //将elem2也入栈
printf("栈顶元素值:%c\n",(*stack1).data);//元素出栈
SElemType elem3; //下面取出的数据放入elem3
Status popResult = Pop(&stack1,&elem3);
printf("出栈执行结果:%d\n",popResult);
printf("出栈元素值:%c\n",elem3);
printf("栈顶元素值:%c\n",(*stack1).data);
//取栈顶元素
SElemType stackTopValue=GetTop(stack1);
printf("获取栈顶元素值为:%c\n",stackTopValue);
printf("\nEND");
return 0;
}
![]()