栈是常用的数据结构之一,下面给出一个链式栈的实现~~
头文件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. 【最大流之sap】【HDU1532】模板题

    与上题一样 纯属测试模板 来自kuangbin的模板 #include <cstdio> #include <cstdlib> #include <cmath> # ...

  2. 关于Console的Main(String[] args)参数输入

    之前接触一个往Console里输入参数的项目,资深QA教我怎么run,灰常脸红. 今日无事,baidu之. Step1 写简单Console Code. class Program { static ...

  3. iOS学习心得——UITableViewCell的复用

    UITableView是在iOS开发中最常用的控件之一.我的第一篇学习心得献给它了         UITableView是由一行一行的UITableViewCell构成的.         首先想这 ...

  4. PHP上传图片至阿里云

    <?php header("Content-type: text/html; charset=utf-8"); header('Access-Control-Allow-Or ...

  5. MFC对话框中解决回车键、ESC键退出的方法

    BOOL CYourDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message==WM_KEYDOWN&&pMsg->wP ...

  6. 利用js制作异步验证ajax方法()

    如何利用js写ajax异步验证.代码如下: window.onload = function(){ var name = document.getElementById('register-name- ...

  7. linux----ln

    1.格式 ln source_file_path target_file_path 2.执行ln 命令的用户要对source_file_path有写权限,才可以创建软连接. 3.souce_file这 ...

  8. QueryString和BASE64

    加号(+)是BASE64编码的一部分,而加号在QueryString中被当成是空格.因此,当一个含有BASE64编码的字符串直接作为URL的一部分时,如果其中含有加号,则使用QueryString读取 ...

  9. CC EAL认证

    国际通用准则(CC) CC(Common Criteria)是国际标准化组织统一现有多种准则的结果,是目前最全面的评价准则.1996年6月,CC第一版发布:1998年5月,CC第二版发布:1999年 ...

  10. C语言入门(15)——结构体与数据抽象

    大多数的计算机运算是对现实世界的模拟,如果想用计算机来模拟现实世界需要用到数据抽象的方法.所谓抽象是从实际的人.物.事和概念中抽取所关心的共同特征,,忽略非本质的细节,吧这些特征用各种概念精确的加以描 ...