栈是常用的数据结构之一,下面给出一个链式栈的实现~~
头文件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. 用Windows Live Writer 2012发博客

    一.软件准备: 最新版的是Windows Live Writer 2012,但是不提供单独的安装包,它是和微软其它软件一起的(包括MSN.Window Move Maker等),软件大小为131M,官 ...

  2. Object-C 重载

    方法重载要保证三个条件 1在同一个类中 2.方法参数类型相同 名称相同 3.方法的参数不同 请看下面的例子 @interface whgMyObject : NSObject -(void)print ...

  3. 【Tomcat】项目自动部署的链接重置错误

    在服务器中装好的tomcat7 ,(服务器是的window server 2008) 在tomcat bin目录运行的 service.bat install 安装服务.然后,设置服务项(服务项名称: ...

  4. Spring学习之Ioc控制反转(2)

    开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...

  5. zoj1076 Gene Assembly

    这道和zoj1025一样,本质是贪心算法,首先要求任意最长的序列,我们只要保证最长就行,也就是在一幅图中找一个最长的链,首先我们需要根据y排序(输入为x,y),因为y大的肯定在y小的后面,然后就直接贪 ...

  6. C# C++ Java接口类型转换

    最近这几天做了一个兼职 ,主要是把C语言以及C#语言封装的dll,经过C++中转为Java语言支持的,主要其中的问题就是类型转换,在此列出常用类型的转换过程. #include "stdaf ...

  7. 万事开头难——Cocos2d-x学习历程(一)

    万事开头难,不知该从哪里开始,不过既然要学习一样新东西,那就从了解它开始吧... Cocos2d-x是一个通用平面游戏引擎,基于一个同样十分著名的游戏引擎Cocos2d-iPhone设计,Cocos2 ...

  8. Repeater控件实现数据绑定,并实现分页效果

    前台显示代码 <pre name="code" class="csharp"><asp:Repeater ID="Repeater1 ...

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

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

  10. 在MySQL数据库建立多对多的数据表关系

    在数据库中,如果两个表的之间的关系为,多对多的关系,如:“学生表和课程表”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联表 步骤1:创建三张数据表Stud ...