栈是常用的数据结构之一,下面给出一个链式栈的实现~~
头文件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. think in python 11 字典

    字典 字典类似于列表,但更加通用 键值对 ,字典是 键与值之间的映射,每个键都映射到一个值上 dict可以创建一个不包含任何项的字典 eng2sp = dict() print eng2sp 还可以给 ...

  2. springmvc jstl

    springmvc运用maven的jetty插件运行成功,部署在tomcat6报错:ClassNotFoundException: javax.servlet.jsp.jstl.core.Config ...

  3. c#部分常用方法

    此文章不断补充 1.判断该字符串是否存在于字符串数组中 string[] arr = {"aaa","bbb","aba","cc ...

  4. HTML1网页三部份内容

    网页三部份内容:HTML CSS Javascript 路径:一般做网页的时候用的相对路径. images/aaa.jpg 网页同一个目录中找images文件夹,再在images里面找aaa.jpg ...

  5. HDU 2473 - Junk-Mail Filter ,并查集的删点

    Problem Description Recognizing junk mails is a tough task. The method used here consists of two ste ...

  6. Python学习笔记(四)Python函数的参数

    Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

  7. Linux下去掉Windows文件的^M

    Windows下文件换行符为\r\n  而Linux下文件的换行为\n 因此在Linux下可以使用vim编辑文件  使用全文替换命令 :%s/\r//g 将\r全部替换掉 也可以在Linux使用dos ...

  8. 使用Python多线程犯的错误总结

    在使用Python多线程的时候,在使用多线程编程的时候,由于对于变量作用域和多线程不是很熟悉,导致在使用多线程的时候,犯了低级的错误. 第一个错误: 在多线程中使用全局变量,导致多个线程修改全局变量. ...

  9. eclipse 改包名

    转载自: http://www.2cto.com/kf/201304/206747.html 1.在项目上右键,选择android tools->rename application packa ...

  10. Oracle EBS-SQL (PO-4):检查采购订单明细.sql

    SELECT PHA.SEGMENT1                  订单号, pha.approved_flag           批准状态, pha.closed_code        订 ...