#include <stdio.h>
 #include <stdlib.h>
 #include <stdbool.h>

 #define EmptyTOS (-1)      //数组堆栈需要
 #define MinStackSize (5)   //数组堆栈需要 

 //堆栈函数的声明
 struct Node;
 typedef struct Node *PtrToNode;
 typedef PtrToNode Stack;
 typedef int ElementType;

 bool IsEmpty(Stack S);                          //检测堆栈是否为空
 Stack CreateStack();                            //创建堆栈
 void DisposeStack(Stack);                       //毁灭堆栈
 void Push(ElementType X, Stack S);              //元素进栈
 ElementType Pop(Stack S);                       //元素出栈
 void MakeEmpty(Stack S);                        //清空堆栈中的元素
 //ElementType Pop(Stack S);                     //元素出栈   (数组实现)
 bool IsFull(Stack S);                           //检测堆栈是否已满 (数组实现需要)
 void printStack(Stack S);                       //输出堆栈中的元素
 struct Node {               //链表结构
     ElementType Element;
     PtrToNode Next;
 }; 

 //struct Node {               //数组结构
 //    int Capacity;      //容量
 //    int TopOfStack:    //栈顶
 //    ElementType *Array;
 //};

 int main()
 {
     int number, flag;
     ElementType X;
     Stack S; 

     flag = ;

        printf("|           堆栈的基本使用           |\n");
     printf("|************************************|\n");
        printf("|            1. 创建堆栈             |\n");
        printf("|            2. 销毁堆栈             |\n");
        printf("|            3. 入栈                 |\n");
        printf("|            4. 出栈                 |\n");
        printf("|            5. 打印堆栈元素         |\n");
        printf("|************************************|\n");

     while (flag) {
     printf("请选择功能 :                      \n");
          scanf("%d", &number);
         switch(number) {
              :
                 S = CreateStack();
                 break; 

              :
                 if (S) {
                     DisposeStack(S);
                 } else
                     printf("堆栈不存在!!!\n");
                 break;

              :
                 if (S) {
                     printf("请输入需要插入的元素:");
                     scanf("%d", &X);
                     Push(X, S);
                 } else
                     printf("堆栈不存在!!!\n");
                 break;

              :
                 if (S) {
                     Pop(S);
                 } else
                     printf("堆栈不存在!!!\n");
                 break;

              :
                 if (S) {
                     printf("堆栈中元素如下:");
                     printStack(S);
                 } else
                     printf("堆栈不存在!!!\n");
                 break; 

             default :
                 printf("程序运行结束,请按任意键退出!!!\n");
                 flag = ;
             }
         }          

    ;
 }

 //函数定义

 bool IsEmpty(Stack S)                             //检测堆栈是否为空 (链表)
 {
     return S->Next == NULL;
 }

 //bool IsEmpty(Stack S)                           //检测堆栈是否为空  (数组)
 //{
 //    return S->TopOfStack == EmptyTOS;
 //}

 Stack CreateStack()                               //创建堆栈   (链表)
 {
     Stack S;

     if (!(S = malloc(sizeof(struct Node))))
         exit(-);
     S->Next = NULL;

     return S;
  } 

 // Stack CreateStack(int MaxElements)             //创建堆栈    (数组)
 //{
 //    Stack S;
 //
 //    if (MaxElements < MinStackSize) {
 //        printf("堆栈空间太小了!!");
 //        return -1;
 //    }
 //
 //    if (!(S = malloc(sizeof(struct Node))))
 //        exit(-1);
 //    if (!(S->Array = malloc(sizeof((ElementType) * MaxStackSize))))
 //        exit(-1);
 //    S->Capacity = MaxStackSize;
 //
 //    return S;
 // } 

  void DisposeStack(Stack S)                       //毁灭堆栈 (链表)
  {
      PtrToNode P, TmpCell;

      P = S->Next;
      S->Next = NULL;
     while (P) {
          TmpCell = P->Next;
          free(P);
          P = TmpCell;
      }

      free(S);
  }

 // void DisposeStack(Stack S)                     //毁灭堆栈    (数组)
 // {
 //     if (S != NULL) {
 //         free(S->Array);
 //         free(S);
 //     }
 // }         

 void Push(ElementType X, Stack S)                  //元素进栈    (链表)
 {
     PtrToNode TmpCell;

     if (!(TmpCell = malloc(sizeof(struct Node))))
         exit(-);
     else {
         TmpCell->Element = X;
         TmpCell->Next = NULL;
     }

     TmpCell->Next = S->Next;
     S->Next = TmpCell;
 }

 //void Push(ElementType X, Stack S)                 //元素进栈    (数组)
 //{
 //    if (!IsFull(S))
 //        S->Array[++TopOfStack] = X;
 //    else
 //        printf("堆栈已满!!\n");
 //}

 ElementType Pop(Stack S)                            //元素出栈    (链表)
 {
     Stack TmpCell;
     ElementType X;

     if (IsEmpty(S)) {
         printf("堆栈为空!!!\n");
         ;
     }
     else {
         TmpCell = S->Next;
         S->Next = TmpCell->Next;
         X = TmpCell->Element;
         free(TmpCell);

         return X;
     }
 }

 //ElementType Pop(Stack S)                          //元素出栈    (数组)
 //{
 //    if (!IsEmpty(S))
 //        return S->Array[TopOfStack--];
 //    else
 //        printf("堆栈为空,出栈异常!!!\n");
 //}

 void MakeEmpty(Stack S)                             //清空堆栈中的元素    (链表)
 {
     PtrToNode P, TmpCell;

     P = S->Next;
     S->Next = NULL;
     while (P) {
         TmpCell = P->Next;
         free(P);
         P = TmpCell;
     }
 }

 //void MakeEmpty(Stack S)                            //清空堆栈中的元素    (数组)
 //{
 //    S->TopOfStack == EmptyTOS;
 //}

 //bool IsFull(Stack S)                               //检测堆栈是否已满 (数组实现需要)
 //{
 //    return S->(++TopOfStack) == S->Capacity;
 //}
 //
 void printStack(Stack S)                             //打印堆栈中元素
 {
     ElementType P;
     while (!IsEmpty(S)) {
         P = Pop(S);
         printf("%d  ", P);
     }
     printf("\n");
 } 

堆栈的实现(c语言)的更多相关文章

  1. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

  2. 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计

    1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到 ...

  3. 利用反汇编手段解析C语言函数

    1.问题的提出函数是 C语言中的重要概念.利用好函数能够充分利用系统库的功能写出模块独立.易于维护和修改的程序.函数并不是 C 语言独有的概念,其他语言中的方法.过程等本质上都是函数.可见函数在教学中 ...

  4. 物联网的语言c,python,go等

    日本生鱼片 电热水器的使用方法http://www.hiry.cn/b/mt/33959.html 物联网层次很多,首先要看你从事哪个层级的工作了.既然你问语言,那么肯定是开发类的工作,开发类的对象中 ...

  5. cgo 和 Go 语言是两码事

    cgo不是Go 借用 JWZ的一句话 有些人,当他们面临一个问题时,认为“我知道,我会使用 cgo ”.那么现在,他们有了两个问题. 最近有人在 Gopher 的 Slack Channel 上使用 ...

  6. [Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

    目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式 ...

  7. [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库

    前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...

  8. (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出

    (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...

  9. Java编程思想学习(一) 一切都是对象

    前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...

  10. Java入门到精通——基础篇之面向对象

    一.概述. Java属于面向对象的一种语言,因为Java是面向对象的语言所以这个语言的诞生需要有五个基本特性: 1)万物皆为对象. 2)程序是对象的集合. 3)每个对象都有自己的由其他对象所构成的存储 ...

随机推荐

  1. IOS开发之自定义系统弹出键盘上方的view(转载)

    这篇文章解决的一个开发中的实际问题就是:当弹出键盘时,自定义键盘上方的view.目前就我的经验来看,有两种解决方法.一个就是利用UITextField或者UITextView的inputAccesso ...

  2. 4. 对list进行sort

    一. sort命令 sort命令可以对list排序 sort命令把字段转先换为double类型在进行比较 sort排序list 127.0.0.1:6379> lrange list2 0 -1 ...

  3. Eclipse中Maven+Spring3.2.8+SpringMVC HelloWorld项目

    本文适合有一定spring和springmvc基础,并想使用Maven管理项目的人. 源码打包:http://pan.baidu.com/s/1hqurUcs 转载请声明出处(http://www.c ...

  4. eclipse 中的注释 快捷键-添加/* */注释-Ctrl+Shift+/

    (4)Ctrl+Shift+/ 说明:添加/* */注释 (5)Ctrl+Shift+\ 说明:消除/* */注释 更多:http://blog.csdn.net/wjeson/article/det ...

  5. HTTP协议下保证登录密码不被获取更健壮方式

    说到在http协议下用户登录如何保证密码安全这个问题:    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...

  6. [Vue]学习中遇到的疑点

    computed:计算属性,官方api上说计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.但是经过测试并没有缓存.案例: computed: { now: function () { c ...

  7. [HTMLDOM]onmousedown、onmouseup 以及onclick事件触发顺序

    摘自w3school:http://www.w3school.com.cn/htmldom/dom_events.asp onmousedown.onmouseup 以及 onclick 事件是鼠标点 ...

  8. 冲突--ScrollView嵌套ListView冲突问题的最优解决方案

    项目做多了之后,会发现其实 ScrollView嵌套ListVew或者GridView等很常用,但是你也会发现各种奇怪问题产生.根据个人经验现在列出常见问题以及代码最少最简单的解决方法. 问题一 :  ...

  9. Java多线程之DaemonThreadFactory

    通过DaemonThreadFactory创建后台线程池 另外:如果是后台线程创建的线程,将都是后台线程. package wzh.daemon; import java.util.concurren ...

  10. jsp页面的使用

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...