栈链的C语言实现
来源:互联网 发布:好源码分享 编辑:程序博客网 时间:2024/04/30 19:42
出栈与入栈是栈的最主要操作,当无法预见栈所需大小时,需要采用栈链的方式。
一、栈链结点
在栈链中,不需要像单链表一样需要头结点。栈链的结构如下图所示
根据该结构,用C语言定义为:
typedef char SElemType
typedef struct StackNode
{
SElemType data;//根据实际需要定义数据类型
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;//指向栈链顶部
int count;//用以判断是否栈为空,可初始化为0
}LinkStack;
二、进栈操作
能够进栈的前提是已成功建立栈空间,即成功调用malloc函数。进栈操作的过程如下图所示。进栈函数所需的参数主要是指向栈顶的指针和入栈内容,因此可定义为:
int Push(LinkStack *pS,SElemType e)
Step1:开辟内存,将需要入栈的元素压入栈:
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
Step2:更改指针
(1)新结点的*next指向原来栈顶:s->next = pS->top;
(2)栈链新的top指针指向新建立的结点:pS->top = s;
Step3:更改栈状态(累计入栈元素个数)
pS->count++;
三、出栈操作
出栈之前需要判断当前栈的状态,如果栈元素个数为零,则显然是空栈,无法进行出栈操作。出栈操作函数同样需要两个参数,一是指向栈链的指针,二是弹出的栈元素,因此定义为:
int Pop(LinkStackPtr *pS,SElemType *e)//之所以是*e,是为了在函数结束后可以取得该弹出元素
出栈操作过程如下图所示:
出栈过程:
Step1:获取弹出元素:*e = pS->top->data;
Step2:top指针指向栈顶:p = pS->top ;pS->top = p->next;//LinkStackPtr p;
Step3:释放结点:free(p);
Step4:更改栈状态
pS->count--;
四、测试程序
#include <stdio.h>#include <stdlib.h>typedef char SElemType ;typedef struct StackNode{SElemType data;struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack{LinkStackPtr top;int count;}LinkStack;//栈指针初始化void InitialStack(LinkStack *L){L->top=NULL;L->count=0;return;}//栈状态int StackEmpty(LinkStack *pS){if(!pS->count)//若为空,则返回1return 1;elsereturn 0;//若非空,则返回0;}//压栈操作int Push(LinkStack *pS,SElemType e){//一般情况下,不存在栈满情况LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));s->data = e;s->next = pS->top;pS->top=s;pS->count++;return 0;}//出栈操作int Pop(LinkStack *pS,SElemType *e){LinkStackPtr p;if(StackEmpty(pS)){printf("栈为空!"); return 0; }*e=pS->top->data;p = pS->top;pS->top = p->next;free(p);pS->count--;return 0;}//打印栈链void PrintStackLink(LinkStack *pS){LinkStackPtr L;int i;//i = pS->count;L = pS->top;if(pS->count == 0){printf("栈为空!");return;}for(i=0;i<(pS->count);i++){printf("%c\n",L->data); L = L->next;}return ;}void main(){//测试char getch;char outch;LinkStack myStack;InitialStack(&myStack);//压栈printf("请输入压入栈的数据(char型),输入#结束");scanf("%c",&getch);while(getch!='#'){Push(&myStack,getch);scanf("%c",&getch);}printf("栈链内容为:\n");PrintStackLink(&myStack);//出栈while(!StackEmpty(&myStack)){Pop(&myStack,&outch);printf("弹出内容为:%c\n",outch);}PrintStackLink(&myStack);while(1);return ;}
- 栈链的C语言实现
- <数据结构>链栈的C语言实现
- 链栈的c语言实现
- c语言:链栈的实现
- 链栈的C语言实现
- 栈的C语言实现
- 栈的C语言实现
- C语言栈的实现
- 栈的C语言实现
- 栈的C语言实现
- 栈的c语言实现
- 栈的C语言实现
- 栈的c语言实现
- c语言栈的实现
- 栈的实现(C语言实现)
- C语言链栈实现
- C语言 实现链栈
- 【C语言】C语言实现简单的链表
- open-iscsi/scst 追踪二 (open-iscsi 用户态管理系统技术架构分析)
- [openGL]视图
- c++实现最长公共子序列
- HTTP协议 (五) 代理
- jsp获取web应用根路径的方法
- 栈链的C语言实现
- group by ,order by ,having 简单用法
- 学习《Opengl编程指南》第7版 第1章
- 登录必备
- ASP.Net 用Infragstics控件导出Excel
- HTTP协议 (六) 状态码详解
- Android之AsyncTask(二)
- 【转】weka里Detailed Accuracy By Class和 Confusion Matrix的含义
- VS2008 入门基本操作