链栈的实现
链栈的实现:
(栈具有先进后出的特点,只能在栈顶进行数据操作(入栈和出栈只能在栈顶进行))
1、本程序带有头结点
2、当有新结点入栈从头部插入数据
3、当需要删除结点时也从头部删除
结构体:
#include #include typedef struct Stack{ int val; //存储数据 struct Stack *Next; //指向下一结点 int nums; //元素数量}Stack_Node;
栈的相关操作:
Stack_Node *InitStack(); //初始化链栈void Push(Stack_Node *stack,int val); //入栈操作int Pop(Stack_Node *stack); //出栈操作boolean isEmpty(Stack_Node *stack); //判断栈是否为空void show(Stack_Node *stack); //显示栈中数据元素int GetNums(Stack_Node *stack); //获取栈中元素数量
主函数:
#include "stack.h"void main(){ Stack_Node *stack; stack = InitStack(); int val ;//保存入栈数据 int opt = 1; //操作选择 while(opt) { printf("----------------------------------\n"); printf("1、入栈操作 2、出栈操作 \n"); printf("3、显示数据 4、获取元素数量\n"); printf("5、退出 \n"); printf("----------------------------------\n"); printf("请输入操作代号:"); scanf("%d",&opt); switch(opt) { case 1: printf("请输入入栈数据:\n"); scanf("%d",&val); Push(stack,val); break; case 2: printf("数据出栈:\n"); int data = Pop(stack); printf("出栈数据为:\t%d\n",data); break; case 3: printf("显示数据:\n"); show(stack); break; case 4: printf("获取元素数量为:\n"); int num = GetNums(stack); printf("元素数量为:\t%d\n",num); break; case 5: printf("退出系统\n"); opt = 0; exit(-1); default: printf("输入有误,请重新输入1~5之间的数字\n"); break ; } } system("pause"); return ;}
初始化链栈:
Stack_Node *InitStack(){ Stack_Node *node = (Stack_Node *)malloc(sizeof(Stack_Node)); if(node == NULL) { printf("内存申请失败...\n"); exit(-1); } node->val = 0; node->Next = NULL; node->nums = 0; return node;}
入栈操作:
void Push(Stack_Node *stack,int val){ //采用头部入栈的方法 Stack_Node *tmp = (Stack_Node *)malloc(sizeof(Stack_Node)); //申请新的结点空间 if(tmp == NULL) { printf("内存申请失败"); return ; } tmp->val = val; //保存传入的数据 tmp->Next = stack->Next; //新结点指向头结点指向的下一元素 stack->Next = tmp; //头结点指向新结点 stack->nums ++; //元素数量加 1}
出栈操作:
int Pop(Stack_Node *stack){ //判断栈中是否有结点存在 if(isEmpty(stack)) { printf("栈为空\n"); return -1; } Stack_Node* delete = stack->Next;//辅助结点栈顶结点 int del_data = delete->val; //获取栈顶结点的数据 stack->Next = delete->Next; //头结点指向栈顶元素的下一结点 stack->nums --; //栈中元素数量减 1 free(delete); //释放结点空间 return del_data; }
判断栈是否为空:
oolean isEmpty(Stack_Node *stack){ //栈中元素数量为 0 或者头结点指向为空时栈为空 if(stack->nums == 0 || stack->Next == NULL) return TRUE; return FALSE;}
输出栈中数据:
void show(Stack_Node *stack){ Stack_Node *node = stack->Next; while(node) { printf("栈中元素为:%d\t\n",node->val); node = node->Next; }}
获取元素数量:
int GetNums(Stack_Node *stack){ return stack->nums;}
说明:此文章为学习笔记,如有侵权联系删除。