栈是常用的数据结构之一,下面给出一个链式栈的实现~~
头文件Stack.h

#ifndef Stack_H
#define Stack_H typedef int Item;
typedef struct node * PNode;
/*定义栈节点类型*/
typedef struct node
{
Item data;
PNode down;
}Node;
/*定义栈类型*/
typedef struct stack
{
PNode top;
int size;
}Stack;
/*构造一个空栈*/
Stack *InitStack(); /*销毁一个栈*/
void DestroyStack(Stack *ps); /*把栈置空*/
void ClearStack(Stack *ps); /*判定是否为空栈*/
int IsEmpty(Stack *ps); /*返回栈大小*/
int GetSize(Stack *ps); /*返回栈顶元素*/
PNode GetTop(Stack *ps,Item *pitem); /*元素入栈*/
PNode Push(Stack *ps,Item item); /*元素出栈*/
PNode Pop(Stack *ps,Item *pitem); /*遍历栈并访问visit函数*/
void StackTraverse(Stack *ps,void (*visit)()); #endif

实现部分Stack.c:

 #include"Stack.h"
#include<malloc.h>
#include<stdlib.h>
/*构造一个空栈*/
Stack *InitStack()
{
Stack *ps = (Stack *)malloc(sizeof(Stack));
if(ps!=NULL)
{
ps->top = NULL;
ps->size = ;
}
return ps;
} /*判定是否为空栈*/
int IsEmpty(Stack *ps)
{
if(ps->top == NULL && ps->size == )
return ;
else
return ;
} /*返回栈大小*/
int GetSize(Stack *ps)
{
return ps->size;
} /*元素入栈*/
PNode Push(Stack *ps,Item item)
{
PNode pnode = (PNode)malloc(sizeof(Node));
if(pnode != NULL)
{
pnode->data = item;
pnode->down = GetTop(ps,NULL);
ps->size++;
ps->top = pnode; }
return pnode;
} /*返回栈顶元素*/
PNode GetTop(Stack *ps,Item *pitem)
{
if(IsEmpty(ps)!=&&pitem!=NULL)
{
*pitem = ps->top->data;
}
return ps->top;
} /*元素出栈*/
PNode Pop(Stack *ps,Item *pitem)
{
PNode p = ps->top;
if(IsEmpty(ps)!=&&p!=NULL)
{
if(pitem!=NULL)
*pitem = p->data;
ps->size--;
ps->top = ps->top->down;
free(p);
}
return ps->top;
} /*销毁一个栈*/
void DestroyStack(Stack *ps)
{
if(IsEmpty(ps)!=)
ClearStack(ps);
free(ps);
} /*把栈置空*/
void ClearStack(Stack *ps)
{
while(IsEmpty(ps)!=)
{
Pop(ps,NULL);
}
} /*遍历栈并访问visit函数 */
void StackTraverse(Stack *ps,void (*visit)())
{
PNode p = ps->top;
int i = ps->size;
while(i--)
{
visit(p->data);
p = p->down;
}
}

测试部分Test.c:

 #include"Stack.h"
#include<stdio.h>
void print(Item i)
{
printf("该节点元素为%d\n",i);
}
main()
{
Stack *ps = InitStack();
int i,item; printf("0-9依次入栈并输出如下:\n");
for(i=;i<;i++)
{
Push(ps,i);
GetTop(ps,&item);
printf("%d ",item);
} printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n");
StackTraverse(ps,print); printf("栈中元素依次出栈并输出如下:\n");
for(i=;i<;i++)
{
Pop(ps,&item);
printf("%d ",item);
} ClearStack(ps);
if(IsEmpty(ps))
printf("\n将栈置空成功\n");
DestroyStack(ps);
printf("栈已被销毁\n"); }

C语言栈的实现的更多相关文章

  1. C语言栈与调用惯例

    C语言栈与调用惯例 1.前言 最近在再看<程序员的自我修养>这本书,对程序的链接.装载与库有了更深入的认识.关于这本书的评价可以去豆瓣看看http://book.douban.com/su ...

  2. C语言栈调用机制初探

    学习linux离不开c语言,也离不开汇编,二者之间的相互调用在源代码中几乎随处可见.所以必须清楚地理解c语言背后的汇编结果才能更好地读懂linux中相关的代码.否则会有很多疑惑,比如在head.s中会 ...

  3. C语言 栈 链式结构 实现

    一个C语言链式结构实现的栈 mStack (GCC编译). /** * @brief C语言实现的链式结构类型的栈 * @author wid * @date 2013-10-30 * * @note ...

  4. C语言 栈 顺序结构 实现

    一个能够自动扩容的顺序结构的栈 ArrStack 实例 (GCC编译). /** * @brief C语言实现的顺序结构类型的栈 * @author wid * @date 2013-10-29 * ...

  5. [数据结构]C语言栈的实现

    有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是) 作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model ...

  6. c语言栈的链表实现

    #include <stdio.h> #include <stdlib.h> #include"PublicDS.h" typedef int ElemTy ...

  7. C语言 - 栈和单链表的实现

    单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...

  8. Go语言栈定义及相关方法实现

    // stack 栈 package Algorithm import ( "errors" "reflect" ) // 栈定义 type Stack str ...

  9. C语言—栈

    栈的操作:进栈和出栈 #include "stdafx.h" #include "stack.h" #define maxsize 20 typedef int ...

随机推荐

  1. iOS开展UI一片—简单的浏览器观看节目

    iOS开发UI篇-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 须要读取或改动属性的控件须要设置属性 序号标签 图片 图片描写叙述 左边button 右边button (2 ...

  2. 图的邻接表存储 c实现

    图的邻接表存储 c实现 (转载) 用到的数据结构是 一个是顶点表,包括顶点和指向下一个邻接点的指针 一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针 刚开始的时候把顶点表初始化 ...

  3. C# DropDownList绑定文件夹

    首先创建一个类,类名称为FileControl, /// <summary> /// 获取制定文件夹下面的文件夹 /// </summary> /// <param na ...

  4. 在Activity中动态设置TextView的隐藏属性

    if (true) { //显示 viewHolder.tvLine.setVisibility(View.INVISIBLE);} else { //不显示 viewHolder.tvLine.se ...

  5. linux(Ubuntu)下mysql字符集完美解决

    本文参考: 1. http://www.blogjava.net/wldandan/archive/2007/09/04/142669.html 2. http://chinaapp.sinaapp. ...

  6. [jQuery] jQuery如何获取同一个类标签的所有的值

    碰巧在开发的时候遇到这个问题,因为jQuery总是只返回第一个类标签的值,所以无法达到我们的要求. 比如: var btn = jQuery('.btn').val(); 获取的只是第一个类标签为bt ...

  7. css 一些常用属性总结

    在项目中经常会用到一些很实用的css代码(*只做功能性记录,不追根究底,如有不合理的欢迎指正) css图片上下居中 /*图片上下居中代码*/ .imgvam { /*非IE的主流浏览器识别的垂直居中的 ...

  8. 收MUD巫师学徒,MUD开发,LPC语言开发

    收MUD巫师学徒,MUD开发,LPC语言开发 对这个有兴趣的联系我,签订协议  Q 184377367

  9. 网络解析 get 和post

    //get同步 - (IBAction)getT:(id)sender { //准备一个Url NSURL *url=[NSURL URLWithString:BASE_URL]; //创建一个请求对 ...

  10. Memcache缓存系统原理

    在Web服务开发中,服务端缓存是服务实现中所常常采用的一种提高服务性能的方法.其通过记录某部分计算结果来尝试避免再次执行得到该结果所需要的复杂计算,从而提高了服务的运行效率. 除了能够提高服务的运行效 ...