有一种爱不解释——我爱C语言!

/*Name:纯C语言实现栈的相关操作Copyright:欢迎共享此代码Author:刁肥宅Date: 04/08/18 21:55Description:调试过程出行了一些失误,教训深刻!
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
#include <time.h>typedef struct Stack
{int Data;struct Stack *Next;
}LStack,*PStack;typedef struct Position
{struct Stack *PTop;struct Stack *PBattom;
}LPosition,*PPosition;bool InitiateStack(PPosition P);/*初始化栈*/
bool Push(PPosition P,int Value);/*压栈*/
bool Pop(PPosition P,int *Tmp);/*弹栈*/
void Top(PPosition P);/*访问栈顶元素*/
void Display(PPosition P);
void ClearStack(PPosition P);/*清空栈*/
bool EmptyStack(PPosition P);/*判断栈是否为空*/
int StackSize(PPosition P);/*求栈所含元素的多少*/int main()
{srand(time(NULL));LPosition P,*LTmp = (LPosition *)malloc(sizeof(LPosition));/*LTmp的重要性在第65行代码处显现,似乎也没用*/InitiateStack(&P);int i,RandomValue,StackLength,*Tmp;/*n*/int Operate,OperatingFrequency,OperatingKey,RandomPush = 0,RandomPop = 0;LTmp = &P;/*在某次测试中(非当前测试函数体),P的地址赋值給LTmp,导致第90行代码对栈的操作,会改变P的指向,因此第104行代码总打印0*//*scanf("%d",&n);*/StackLength = rand() % 10000 + 1;OperatingFrequency = rand() % 100 + 1;if( !InitiateStack(&P)  ){printf("Initiate failed.\n");exit(EXIT_FAILURE);}else{for(i = 0;i < StackLength;i ++){RandomValue = rand() % 10000 + 1;/*RandomValue = i + 1;*//*scanf("%d",&RandomValue);*/Push(&P,RandomValue);}}for(i = 0;i < OperatingFrequency;i ++){Operate = rand() % 2 + 0;/*在0或者1之间选择*/OperatingKey =rand() % 10000 + 1;/*随机压栈的数值*/if(!Operate)/*0则弹栈*/{Pop(&P,&Tmp);RandomPop ++;}else/*1则压栈*/{Push(&P,OperatingKey);RandomPush ++;}}Display(&P);printf("\nRandomPush = %d,RandomPop = %d,variable 'StackLength' = %d\n",RandomPush,RandomPop,StackLength);//ClearStack(&P);//Pop(&P,&Tmp);/*if(Pop(&P,&Tmp))printf("Y\n");elseprintf("N\n");*//*在某次测试中(非当前测试函数体),正确显示栈所含元素个数*///printf("Stack size = %d\n",StackSize(LTmp));/*for(i = 0;i < n;i ++){Top(&P);if(Pop(&P,&Tmp))continue;elsebreak;}*//*在某次测试中(非当前测试函数体),总显示含0元素*/printf("\nStack size = %d\n",StackSize(&P));return 0;
}bool InitiateStack(PPosition P)
{P->PTop = (struct Stack*)malloc(sizeof(struct Stack));/*相当于申请一个新结点*/if(!(P->PTop))/*申请不成功。养成良好的习惯,最好预先判断;万一哪天一个不小心内存泄漏了,哦嚯!*/return false;P->PBattom = P->PTop;/*栈底指向栈顶*//*上面这句话我原来写作:P->PTop = P->PBattom;查了很长时间才发现问题是:很丢人,没有初始化的指针就拿来赋值*/P->PTop->Next = NULL;/*栈顶指针置为空*/return true;/*初始化成功*///return P;
}bool Push(PPosition P,int value)
{LStack *PNew = (LStack *)malloc(sizeof(LStack));/*相当于申请一个新结点*/if(!PNew)/*申请不成功,压栈失败。养成良好的习惯,最好预先判断;万一哪天一个不小心内存泄漏了,哦嚯!*/return false;PNew->Data = value;/*数值赋給值域*/PNew->Next = P->PTop;/*新结点的指针域指向栈顶*/P->PTop = PNew;/*新结点成为新的栈顶*/return true;/*压栈成功*/
}bool Pop(PPosition P,int *Tmp)
{LStack *PTmp = NULL;/*申请一个新结点,赋值为空*/LPosition *LPTmp = (LPosition *)malloc(sizeof(LPosition));/*开辟一段空间給新结点*/if(P->PTop->Next == NULL)/*栈顶指针为空说明栈为空*/return false;/*弹栈失败*/LPTmp = P;/*为什么创建这个临时结点,刁肥宅自己也不清楚,习惯吧*/*Tmp = LPTmp->PTop->Data;LPTmp->PTop = LPTmp->PTop->Next;/*栈顶的下一栈元素的指针指向栈顶*/free(P);/*弹栈后释放空间*/return true;/*弹栈成功*/
}void Top(PPosition P)
{LStack *PTmp = P->PTop;/*新建栈指针指向栈顶*/printf("%d\n",PTmp->Data);/*打印栈顶元素 */
}void Display(PPosition P)
{LStack *Tmp = P->PTop;/*新建栈指针指向栈顶*/int Line = 0;/*统计已结点个数*/while(Tmp->Next != NULL)/*当栈顶指针不为空时*/{printf("%-6d",Tmp->Data);/*打印栈顶元素*/Line ++;if(Line % 10 == 0)printf("\n");/*每行打印10个元素*/Tmp = Tmp->Next;/*使栈顶的下一栈元素的指针指向栈顶*/}
}void ClearStack(PPosition P)
{LPosition *PTmp = (LPosition *)malloc(sizeof(LPosition));/*创建临时位置指针*/while(P->PTop->Next != NULL)/*当栈顶指针不为空时*/{PTmp = P;/*栈顶位置指针赋給临时位置指针*/P->PTop = P->PTop->Next;/*使栈顶的下一栈元素的指针指向栈顶*/free(P);/*释放当前栈顶元素的空间*/}
}bool EmptyStack(PPosition P)
{return P->PTop->Next == NULL;/*当栈为空时,这句话为真,函数返回true;当栈非空时,这句话为假,函数返回false*/
}int StackSize(PPosition P)
{LPosition *PTmp = (LPosition *)malloc(sizeof(LPosition));/*创建临时位置指针*///LStack *STmp = P->PTop;PTmp = P;/*栈顶指针赋給临时位置指针*/int ID = 0;/*初始化计数变量为0*/while(PTmp->PTop->Next != NULL)/*当现在的栈顶元素指针不为空时,执行循环体*/{PTmp->PTop = PTmp->PTop->Next;/*使栈顶的下一栈元素的指针指向栈顶*/ID ++;/*计数加一*/}return ID;/*返回栈元素的个数*/
}

刁肥宅手笔:纯C语言实现栈的相关操作相关推荐

  1. 刁肥宅手笔:纯C语言实现链式队列的相关操作

    先上图,以图服人: 图一 程序运行截图1 图二 程序运行截图2 上代码: 头文件LinkQueue.h: /*LinkQueue.h*/#ifndef LINKQUEUE_H_INCLUDED #de ...

  2. 刁肥宅手笔:纯C语言利用链栈实现从后缀表达式Array中顺序输入表达式并求值

    链栈+后缀表达式求值算法,借用我自己上次C语言写的链栈,详细实现代码如下: 头文件C_Stack.h: /*C_Stack.h*/#ifndef C_STACK_H_INCLUDED #define ...

  3. 刁肥宅数据结构课设:布隆过滤器的实现和应用(v 1.1,修正非最终版)

    项目代码和报告的GitHub地址:https://github.com/25thengineer/Data-structure-course-design-The-Implementations-an ...

  4. 一拖再拖,刁肥宅个人主页终上线!

    模板在此.侵删! 个人主页仅用于展示个人信息,无任何商业目的! Projects仍使用原作者的信息,并未改动,将会于约一周后修改为本人信息. 域名目前在进行备案中,不日上线. 图1 Home 图2 A ...

  5. 简易英文统计和加密系统的设计实现(纯C语言实现,包含文件操作、注释多、易理解)

    ❤️作者主页:微凉秋意

  6. c语言程序构造二叉排序树,C语言实现二叉排序树的相关操作

    本文链接: 二叉排序树(Binary Sort Tree)c语言 二叉排序树,又称为二叉查找树.它或则是一颗空树,或者是带有以下性质的二叉树: 构造二叉排序树的目的,并不是为了顺序,而是为了提升查找和 ...

  7. c语言实现新建目录函数,C语言中改变目录的相关操作函数详解

    C语言fchdir()函数:改变当前工作目录头文件: #include 定义函数: int fchdir(int fd); 函数说明:fchdir()用来将当前的工作目录改变成以参数fd 所指的文件描 ...

  8. Go 语言 bytes.buffer write 相关操作

    为什么80%的码农都做不了架构师?>>>    // MyBuffer project main.go package mainimport ("bytes"&q ...

  9. 肥宅快乐还是不快乐,拓展欧几里得,exgcd???bfs

    扩展欧几里德算法 先介绍什么叫做欧几里德算法有两个数 a b,现在,我们要求 a b 的最大公约数,怎么求?枚举他们的因子?不现实,当 a b 很大的时候,枚举显得那么的naïve ,那怎么做?欧几里 ...

最新文章

  1. Excel对重复数据分组,求出不同的数据(office 2013)
  2. 怎样把pdf转换成word
  3. 关于IIS和Serv-U在同一台服务器中端口冲突问题
  4. 使用NHibernate绑定页面数据时,出现未能加载视图状态,正在向其中加载视图状态。。。。的Bug...
  5. 语言 OJ 高低位逆转_C语言调动硬件的原理是什么?
  6. CentOS7更换镜像源
  7. python 抛出异常_python 异常
  8. 5行代码解决——L1-042 日期格式化 (5分)
  9. awk或者sed识别和替换数据中最后一列的缺失值(转载)
  10. 基于ASP.net耳机网店商城系统(前台页面+后台页面)
  11. 斯坦福大学CS143编译原理课程笔记:1.编译器与解释器简介
  12. 【瑕疵检测】基于matlab GUI OTSU织物疵点检测【含Matlab源码 860期】
  13. 敏感词测试软件,作者敏感词检测工具
  14. 百战程序员python资源_Python【北京尚学堂·百战程序员】
  15. 潇洒郎: websockets 服务端设计:多线程执行async方法
  16. 可视化实验五:大数据可视化工具—NodeXL
  17. Ti c64x 优化基本策略
  18. windows7无声音,提示未插入扬声器或耳机的解决
  19. 程序员眼中的中国传统文化-王阳明《传习录》16
  20. 你必须认识的五名网络女红人

热门文章

  1. 编译在G1上运行的android 2.2(froyo)代码_正规版
  2. android起始页面与导航页面
  3. 一喝到威士忌真是什么烦恼都忘了
  4. NOI Online 2020 Round3 滚粗记
  5. Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案
  6. ScriptX.cab打印经验交流
  7. linux 查询hba卡类型,Centos系统查询hba卡型号
  8. 我们该如何设计数据库:“普通——文艺——二逼”的区别
  9. 项目经理年终总结|一个高层项目管理者的年终反思
  10. 淘宝店小蜜配置手册——自定义知识库的应答模式与测试