c语言编写的栈的实现

c语言编写的栈的实现
c语言编写的栈的实现

stack.h

#ifndef _STACK_H_

#define _STACK_H_

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

#define STACK_INIT_SIZE 100 // 栈储存空间的初始分配量

#define STACKINCREMENT 10 // 储存空间分配增量

typedef int Status

typedef char SElemType

typedef struct {

SElemType *base;// 储存数据元素的数组

SElemType *top; // 栈顶指针

int stacksize; // 当前分配的栈空间大小,以sizeof(SElemType)为单位

}SqStack;

//** 构造一个空栈

Status InitStack(SqStack *S);

//** 销毁栈

Status DestroyStack(SqStack *S);

//** 栈是否为空

Status StackEmpty(SqStack *S);

//** 入栈

Status Push(SqStack *S,SElemType e);

//**取栈顶

SElemType GetTop(SqStack *S);

//** 出栈

SElemType Pop(SqStack *S);

//** 栈长度

int StackLength(SqStack *S);

//** 遍历

Status StackTraverse(SqStack *S,Status( *visit)(SElemType)); Status visit(SElemType e);

#endif

stack.c

#include

#include

#include

#include"stack.h"

/*********************************************** ************************************************/

int main(int argc,char* argv[])

{

SqStack S; //=(SqStack *)malloc(sizeof(SqStack));

printf("(1)初始化顺序栈。\n");

InitStack(&S);

return 0;

}

//构造一个空栈S

Status InitStack(SqStack *S)

{

S->base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

if(!s->base)

{

printf("init error!\n");

exit(OVERFLOW);

}

S->top = S->base;

S->stacksize = STACK_INIT_SIZE;

printf("init OK\n");

return OK;

}

//销毁栈S

Status DestroyStack (SqStack *S) {

free(S->base);

//free(S->top);

S->base=NULL;

S->top=NULL;

S->stacksize=0;

return OK;

}

//判断栈S是否为空

Status StackEmpty (SqStack *S) {

if(S->base==S->top)

return TRUE;

else

return FALSE;

}

//入栈

Status Push (SqStack *S, SElemType e)

{

if(S->top - S->base >= S->stacksize)

{

//栈满,追加储存空间

S->base = (SElemType *)realloc(S->base,(S->stacksize +\

STACKINCREMENT) * sizeof(SElemType));

if (!S->base)

{

printf("malloc error when push\n");

exit(OVERFLOW);

}

S->top=S->base + S->stacksize;

S->stacksize += STACKINCREMENT;

}

*S->top++=e;

return OK;

}

//** 取栈顶元素,不删除

SElemType GetTop (SqStack *S)

if(S->top==S->base) return ERROR;

//e = S->top-1;

return *(S->top-1);

}

//**栈长度

int StackLength (SqStack *S)

{

//返回S的元素个数,即栈的长度

return (S->top - S->base);

}

//** 出栈(弹出一个)

SElemType Pop (SqStack *S)

{

//若栈不空,则删除S的栈顶元素

if (S->top==S->base) return ERROR;

return (*--S->top);

//** 遍历栈

Status StackTraverse (SqStack s,Status( *visit)(SElemType)) {

while (S.top!=S.base)

visit(*--S.top); //加了个*号

return OK;

}

Status visit(SElemType e)

{

printf("%c\n",e);

return OK;

}

利用栈实现c语言计算器

栈的应用:C实现简单计算器(表达式的计算) 作为栈的著名应用,表达式的计算可以用下面方法实现: 首先建立两个栈,操作数栈NUM_S和运算符栈OPR_S。 其中,操作数栈用来存储表达式中的操作数;运算符栈用来存储表达式中的运算符。可以用字符‘=’来表示表达式结束符。 自左至右的扫描待处理的表达式,并假设当前扫描到的符号为W,根据不同的符号W 做如下不同的处理: 1.若W为操作数,则将W压入操作数栈NUM_S,且继续扫描下一个字符; 2.若W为运算符,则根据运算符的性质做相应的处理: (0)若符号栈为空,无条件入栈当前指针指向的字符 (1)若w为不大于运算符栈栈顶的运算符,则从操作数栈NUM_S中弹出两个操作数,设先后弹出的操作数为a、b,再从运算符栈 OPR_S中弹出一个运算符,比如为+,然后作运算a+b,并将运算结果压入操作数栈NUM_S。 (2)若w为左括号或者运算符的优先级大于运算符栈栈顶的运算符,则将运算符W 压入运算符栈OPR_S,并继续扫描下一个字符。 (3)若运算符W为右括号,循环操作(设先后弹出的操作数为a、b,再从运算符栈OPR_S中弹出一个运算符,比如为+,然后作运 算a+b, 并将运算结果压入操作数栈NUM_S),直到从运算符栈中弹出第一个左括号。 (4)若运算符W为表达式结束符‘=’,循环操作(设先后弹出的操作数为a、b,再从运算符栈OPR_S中弹出一个运算符,比如为 +,然后作运算a+b, 并将运算结果压入操作数栈NUM_S),直到运算符栈为空为止。此时,操作数栈栈顶元素即为表达式的 值。 ====================================================================== === 举例:计算3+(5-2*3)/4-2= (1)开始栈为空,3入栈,+入栈,(无条件入栈,5入栈,-号优先级比(高,所以-号入栈,2入栈,*优先级比目前栈顶的-号优先级高,所以*入栈,3入栈,接着扫描到)括号,)括号不入栈 | | | | --------- ---------- | 3 | | * | --------- ---------- | 2 | | - |

c语言实现一.二叉树操作 二.用栈实现算术表达式求值 课设报告

目录 题目一.二叉树操作(1)二.算术表达式求 (1) 一、课程设计的目的 (1) 二、课程设计的内容和要求 (1) 三、题目一设计过程 (2) 四、题目二设计过程 (6) 五、设计总结 (17) 六、参考文献 (18)

题目一.二叉树操作(1)二.算术表达式求 一、课程设计的目的 本学期我们对《数据结构》这门课程进行了学习。这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。 (1)题目一的目的: 1、掌握二叉树的概念和性质 2、掌握二叉树的存储结构 3、掌握二叉树的基本操作 (2)题目二的目的: 1、掌握栈的顺序存储结构和链式存储结构 2、掌握栈的先进后出的特点 3、掌握栈的基本运算 二、课程设计的内容和要求 (1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为 加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值

三、题目一设计过程 1、题目分析 现已知一棵二叉树的先序遍历序列和中序遍历序列,依次从先序遍历序列中取结点,由先序序列确定根结点(就是第一个字母),每次取出一个结点就与中序遍历的序列进行比较,当相等的时候,中序遍历序列就被分成以该结点为根的二叉树子树,该结点左部分为左子树,右部分为右子树,直到取完先序列里的所有结点,则二叉树构造完毕(树用链式存储结构存储),用递归实现! 由建好的二叉树,先判断这棵树是否为空,若不为空则找数的左子树,统计它的高度,然后找树的右子树,统计它的高度,比较左子树和右子树的高度,然后返回其中大的那个值加一,则求出数的高度。这里用递归实现! 2、算法描述 main ( )(主函数) 先构造一颗二叉树,初始化为空,用来存储所构造的二叉树,并输入一棵树的先序序列和中序序列,并统计这个序列的长度。然后调用实现功能的函数。 void CreateBiTree(BiTree *T,char *pre,char *in,int len)(由先序序列和中序序列构造二叉树) 根据前序遍历的特点, 知前序序列(pre)的首个元素(pre[0])为根(root), 然后在中序序列(in)中查找此根(pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。设根前边有n个元素,则又有, 在前序序列中,紧跟着根(root)的n个元素序列(即pre[1...n]) 为左子树, 在后边的为右子树,而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为pre[1...n]), 中序序列为in[0...n-1], 分别为原序列的子串, 构造右子树同样。这里用递归实现! int Depth(BiTree T)(求树的深度) 当所给的参数T是NULL时,返回0。说明这个树只有一个叶子节点深度为0,当所给的参数不是NULL时,函数调用自己看看这个参数的左分支是不是NULL,

数据结构(C语言)栈的基本操作

实验名称栈的基本操作 实验目的 掌握栈这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (1)初始化栈; (2)判栈为空; (3)出栈; (4)入栈。 算法设计分析 (一)数据结构的定义 struct stackNode{ int data; struct stackNode *nextPtr; }; typedef struct stackNode listStact; typedef listStact *stackNodePtr; (二)总体设计 程序由主函数、入栈函数,出栈函数,删除函数判官是否为空函数和菜单函数组成。 (1)主函数:调用各个函数以实现相应功能

(三)各函数的详细设计: Function1: void instruct() //菜单 (1):使用菜单显示要进行的函数功能; Function2:void printStack(stackNodePtr sPtr) //输出栈 (1):利用if判断栈是否为空; (2):在else内套用while(头指针不为空条件循环)循环输出栈元素; Function3:void push(stackNodePtr *topPtr,int value //进栈 (1):建新的头指针; (2):申请空间; (3):利用if判断newPtr不为空时循环进栈 (4):把输入的value赋值给newPtr,在赋值给topPtr,再指向下一个位置; Function4:int pop(stackNodePtr*topPtr) //删除 (1):建新的头指针newPtr; (2):利用if判断newPtr是否为空,再删除元素。 (3):把topPtr等于newPtr,把头指针指向的数据赋值给topValue,输出要删除的数据值,头指针指向下一个位置,并清空newPtr; (4):完成上述步骤后,return toPvalue,返回;

详解堆栈的几种实现方法——C语言版

详解堆栈的几种实现方法——C语言版 基本的抽象数据类型(ADT)是编写C程序必要的过程,这类ADT有链表、堆栈、队列和树等,本文主要讲解下堆栈的几种实现方法以及他们的优缺点。 堆栈(stack)的显著特点是后进先出(Last-In First-Out, LIFO),其实现的方法有三种可选方案:静态数组、动态分配的数组、动态分配的链式结构。 静态数组:特点是要求结构的长度固定,而且长度在编译时候就得确定。其优点是结构简单,实现起来方便而不容易出错。而缺点就是不够灵活以及固定长度不容易控制,适用于知道明确长度的场合。 动态数组:特点是长度可以在运行时候才确定以及可以更改原来数组的长度。优点是灵活,缺点是由此会增加程序的复杂性。 链式结构:特点是无长度上线,需要的时候再申请分配内存空间,可最大程度上实现灵活性。缺点是链式结构的链接字段需要消耗一定的内存,在链式结构中访问一个特定元素的效率不如数组。 首先先确定一个堆栈接口的头文件,里面包含了各个方案下的函数原型,放在一起是为了实现程序的模块化以及便于修改。然后再接着分别介绍各个方案的具体实施方法。 堆栈接口stack.h文件代码: [cpp]view plaincopy 1./* 2.** 堆栈模块的接口 stack.h 3.*/ 4.#include 5. 6.#define STACK_TYPE int /* 堆栈所存储的值的数据类型 */ 7. 8./* 9.** 函数原型:create_stack 10.** 创建堆栈,参数指定堆栈可以保存多少个元素。 11.** 注意:此函数只适用于动态分配数组形式的堆栈。 12.*/ 13.void create_stack(size_t size); 14. 15./* 16.** 函数原型:destroy_stack 17.** 销毁一个堆栈,释放堆栈所适用的内存。 18.** 注意:此函数只适用于动态分配数组和链式结构的堆栈。 19.*/ 20.void destroy_stack(void); 21. 22./*

C语言 用栈实现进制转换

C语言用栈实现进制转换 #include #include #include #include #define S_SIZE 100 //栈所占空间的大小 #define STACKINCREAMENT 10 //扩充空间时一次扩充十个字节struct SqStack { int *base; //栈底 int *top; //栈顶 int stacksize;//栈当前的存储空间 }*S; //主函数开始 void main() { //子函数声明 void InitStack(S);//初始化空栈 int StackEmpty(SqStack S);//判栈空 void GetTop(SqStack S,int &e);//获得栈顶元素 void push(SqStack &S,int e);//进栈 void pop(SqStack &S,int &e);//出栈 void convert(SqStack &5,int N,int n);//十进制转N进制 int i,num; unsigned n,N;//要转换的进制数及要转换的数 SqStack s; InitStack(s);//初始化空栈 printf("输入要转换的十进制数和要转换为的进制数:\n"); scanf("%d,%d",&N,&n); printf("%d转换为%d进制后为:\n",N,n); convert(s,N,n); } void InitStack(SqStack &S) { S.base = (int *)malloc(S_SIZE*sizeof(int)); S.stacksize=S_Size; S.top=S.base;//初始化空栈 } int StackEmpty(SqStack S) {

C语言实现进栈和出栈

使用C++中STL的stack,只有C++中有,C标准库没有STL。 程序:(单整数) #include #include using namespace std; stacks; int main() { int a,b; scanf("%d",&a); s.push(a); printf("%d\n",s.top()); s.pop(); return 0; } 方法二: 自己写程序(整数): #include const static int g_iStackSize = 100; //定义栈长度,为100 static int g_iStackPoint = -1; //初始化栈指针为-1,也就是栈里一个元素都没有//定义栈元素数据结构,可以扩展为任意类型数据 typedef struct tagStackData { int iData; //栈元素的数据,整型 }stStackData,* pstStackData; //栈只保存栈元素指针 pstStackData g_arrStack[g_iStackSize];//这个就是栈体了,一个长度为stacksize的数组//压元素入栈,可以返回栈指针当前位置 //@param data 压入栈的元素 //@return int 为100时就是满了 int push(const pstStackData data) { if(g_iStackPoint >= g_iStackSize)//也就是栈满了 { //提示栈满 printf("stack is full.\n"); //返回栈指针位置 return g_iStackPoint; } else//栈还没满 {

基于栈的c语言迷宫问题与实现 (2)

数据结构与算法实验报告

基于栈的C语言迷宫问题与实现 一.问题描述 多年以来,迷宫问题一直是令人感兴趣的题目。实验心理学家训练老鼠在迷宫中寻找食物。许多神秘主义小说家也曾经把英国乡村花园迷宫作为谋杀现场。于是,老鼠过迷宫问题就此产生,这是一个很有趣的计算机问题,主要利用“栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。 迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。 一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1 表示不能通过。现假设耗子从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角[m,n] 出去的路径。下图是一个迷宫的示意图: 入口 出口

迷宫示意图 二.算法基本思想 迷宫求解问题是栈的一个典型应用。基本算法思想是:在某个点上,按照一定的顺序(在本程序中顺序为上、右、下、左)对周围的墙、路进行判断(在本程序中分别用1、0)代替,若周围某个位置为0,则移动到该点上,再进行下一次判断;若周围的位置都为1(即没有通路),则一步步原路返回并判断有无其他通路,然后再次进行相同的判断,直到走到终点为止,或者确认没有任何通路后终止程序。 要实现上述算法,需要用到栈的思想。栈里面压的是走过的路径,若遇到死路,则将该位置(在栈的顶层)弹出,再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。如此反复循环,直到程序结束。此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序打印后,即可得到正确的迷宫通路。 三.程序具体部分的说明 1.迷宫的生成 根据题目的要求,迷宫的大小是自定义输入的。所以在程序中用malloc申请动态二维数组。数组中的元素为随机生成的0、1。数组周围一圈的元素全部定义为1,以表示边界。 2.栈的C语言实现 为了实现栈的功能,即清空、压栈、弹出、返回栈顶元素,在程序中编写了相应的函数。 MakeNULL 清空栈 Push 将横、纵坐标压栈 Topx 返回栈顶存储的横坐标 Topy 返回栈顶存储的纵坐标 Pop 弹出栈顶元素 3.具体的判断算法

链式栈基本操作C语言实现学习代码

#define_CRT_SECURE_NO_WARNINGS #include #include #define datatype int struct stack1 { int num; datatype data; struct stack1*pnext; }; typedef struct stack1stack; stack*init(stack*phead);//初始化 stack*push(stack*phead,int num,datatype data);//压栈stack*pop(stack*phead,stack*tnode);//出栈 stack*freeall(stack*phead);//清空 void printf1(stack*phead);//打印 源文件 #define_CRT_SECURE_NO_WARNINGS #include #include #include"abc.h" stack*init(stack*phead) { return NULL; } stack*push(stack*phead,int num,datatype data) { stack*p=(stack*)malloc(sizeof(stack)); p->num=num; p->data=data; p->pnext=NULL; if(phead==NULL) { phead=p; return phead; } else { stack*q=phead; while(q->pnext!=NULL)

c语言编写的栈的实现

stack.h #ifndef _STACK_H_ #define _STACK_H_ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 // 栈储存空间的初始分配量 #define STACKINCREMENT 10 // 储存空间分配增量 typedef int Status typedef char SElemType typedef struct { SElemType *base;// 储存数据元素的数组 SElemType *top; // 栈顶指针 int stacksize; // 当前分配的栈空间大小,以sizeof(SElemType)为单位 }SqStack;

//** 构造一个空栈 Status InitStack(SqStack *S); //** 销毁栈 Status DestroyStack(SqStack *S); //** 栈是否为空 Status StackEmpty(SqStack *S); //** 入栈 Status Push(SqStack *S,SElemType e); //**取栈顶 SElemType GetTop(SqStack *S); //** 出栈 SElemType Pop(SqStack *S); //** 栈长度 int StackLength(SqStack *S);

//** 遍历 Status StackTraverse(SqStack *S,Status( *visit)(SElemType)); Status visit(SElemType e); #endif stack.c #include #include #include #include"stack.h" /*********************************************** ************************************************/ int main(int argc,char* argv[]) { SqStack S; //=(SqStack *)malloc(sizeof(SqStack));

C语言实现十进制转换为任意进制(栈)

实验报告 课程名称:数据结构 年级班级:计算机1712 学号姓名:查玉坤 2017116128 任课教师:康长青

实验目的 设计算法,把十进制整数转换为二至九进制之间的任一进制输出。 实验内容 代码如下: #include #include #define INITSIZE 100 typedef int ElemType; typedef struct { int top; ElemType *base; int stacksize; }sqstack; /*初始化操作(创建一个空栈S)*/ void initstack(sqstack *S) { S->base=(ElemType *)malloc(INITSIZE*sizeof(ElemType)); S->top=0; S->stacksize=INITSIZE; } /*入栈操作(将值为x的数据元素插入到栈S中,使之成为栈顶元素)*/ int push(sqstack *S,ElemType x) { if(S->top>=S->stacksize) {S->base=(ElemType*)realloc(S->base,(S->stacksize+1)*sizeof(ElemType)); if(!S->base) return 0; S->stacksize++; } S->base[S->top++]=x; return 1; } /*输出栈操作(输出自栈顶到栈底的元素值)*/ void list(sqstack *S) { int i;

for(i=S->top-1;i>=0;i--) printf("%d",S->base[i]); printf("\n"); } int main(){ int a,b,Jin,x,X,size; a=1; printf("输入一个十进制数\n"); scanf("%d",&x); X=x; printf("需要转化为多少进制数?\n"); scanf("%d",&Jin); sqstack S; initstack(&S); while(x>=Jin){ a=(x%Jin); b=(x/Jin); push(&S,a); x=b; } push(&S,x); printf("转换的%d进制数为:",Jin); list(&S); printf("验证:\n"); for(int i=S.top;i>0;i--){ if(i-1!=0) printf("%d*(%d^%d)+",S.base[i-1],Jin,i-1); else printf("%d*(%d^0)=%d\n",S.base[i-1],Jin,X); } return 0; }

CC语言实现的数据结构课程设计的计算器堆栈

C、C++语言实现的数据结构课程设计的计算器(堆栈) /* // 我真诚地保证: // 我自己独立地完成了整个程序从分析、设计到编码的所有工作。 // 如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中// 详细地列举我所遇到的问题,以及别人给我的提示。 // 我的程序里中凡是引用到其他程序或文档之处, // 例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段, // 我都已经在程序的注释里很清楚地注明了引用的出处。 // 我从未没抄袭过别人的程序,也没有盗用别人的程序, // 不管是修改式的抄袭还是原封不动的抄袭。 // 我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转。 // <李雷阳> */ /******************************************************************** 用堆栈做的计算器程序* 创建者:李雷阳* 创建时间:2011.03.12 * 最后修改时间:2011.03.15 * /******************************************************************** /******************************************************************** 本程序功能:实现用堆栈处理计算表达式 具体内容: I: 如果算式里面有计算式不应该出现的字符,则将其智能略去 如:将(1.4a54+2f.6)*3.09s+4ff看成(1.454+2.6)*3.09+4 II: 检查括号是否匹配,如果匹配,再检查是否出现在合法位置 如:(8*(7-4)不匹配,以及65*(72+98)(70-45)匹配但是不合法 III: 检查计算数与计算符号的数量是否合格 如:+23-4* 、23-4*、+23-4 等等

C语言 栈的指针实现

C语言栈的指针实现 #include #include #include typedef struct snode *slink; typedef struct snode { //创建栈,储存元素 //StackItem element; int element; slink next; }StackNode; void Error(char *s) { printf("%s\n", s); system("pause"); exit(1); } slink NewStackNode() { slink p; if ((p = (StackNode *)malloc(sizeof(StackNode))) == 0)

Error("Echausted memory."); else return p; } //数据成员element 存储栈元素,next 是指向下一个结点的指针,函数NewStackNode()创建一个新结点 //用指针实现的链栈 typedef struct Istack *Stack; typedef struct Istack { slink top; //栈顶结点指针 }Lstack; /*top 是指向栈顶结点的指针*/ Stack StackInit() //将top 置为空指针,创建一个空栈 { Stack S = (Lstack *)malloc(sizeof*S); S->top = 0; return S; } int StackEmpty(Stack S) //简单的检测指向栈顶的指针top 是否为空指针 { return S->top == 0; } int StackFull(Stack S) //通过StackMenFull()为栈S试分配一个新结点,检测栈空间是否

c语言实现栈的操作

#include #include #define howlarge 100 typedefstruct{ int *top; int *base; int large; }roud; voidcreat(roud&l) { l.base=l.top=(int *)malloc(howlarge*sizeof(int)); if(!l.base) exit(0); https://www.360docs.net/doc/6b2656471.html,rge=howlarge; } void push(roud&l,int n) { if(l.top-l.base>=https://www.360docs.net/doc/6b2656471.html,rge) { l.base=(int *)realloc(l.base,(https://www.360docs.net/doc/6b2656471.html,rge+howlarge)*sizeof(int)); if(!l.base) exit(0); l.top=l.base+howlarge; https://www.360docs.net/doc/6b2656471.html,rge+=howlarge; } int i=0,k=0; for(;i=https://www.360docs.net/doc/6b2656471.html,rge) { l.base=(int *)realloc(l.base,(https://www.360docs.net/doc/6b2656471.html,rge+howlarge)*sizeof(int)); if(!l.base) exit(0); l.top=l.base+howlarge; https://www.360docs.net/doc/6b2656471.html,rge+=howlarge; } int k; printf("请输入栈头元素\n"); scanf("%d",&k); *l.top++=k; l.top--; }

数据结构C语言版_栈实现行编辑程序

#include <stdio.h> #include <malloc.h> #include <io.h> /* 数据结构C语言版栈实现行编辑程序 P49-P50 编译环境:Dev-C++ 4.9.9.2 日期:2011年2月12日 */ typedef char SElemType; // 栈的元素类型 #define STACK_INIT_SIZE 10 // 存储空间初始分配量 #define STACKINCREMENT 2 // 存储空间分配增量 // 栈的顺序存储表示 P46 typedef struct SqStack { SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL SElemType *top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; // 顺序栈 FILE *fp; // 构造一个空栈S。 int InitStack(SqStack *S) { // 为栈底分配一个指定大小的存储空间 (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if( !(*S).base ) exit(0); // 存储分配失败 (*S).top = (*S).base; // 栈底与栈顶相同表示一个空栈 (*S).stacksize = STACK_INIT_SIZE; return 1; } // 销毁栈S,S不再存在。 int DestroyStack(SqStack *S) { free((*S).base); //释放栈底的空间,并置空

顺序栈的实现 c语言

typedef int ElemType; #include #include #include #include #include #include #include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE _1 typedef int Status; typedef int Boolean; typedef int SElemType; #define STACK_INIT_SIZE 10 #define STACK_INCREMENT 2 struct SqStack { SElemType *base; SElemType *top; int stacksize; }; void InitStack(SqStack &s) { if(!(S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)))) exit(OVERFLOW); S.top=S.base; S.stacksize= STACK_INIT_SIZE; } void Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base+S.stacksize; S.stacksize+=STACK_INCREMENT; }

c语言栈队列链表算法代码实现

#include #define null 0 #define len sizeof(struct lnode) int n; struct lnode *creatlist(); struct lnode *listinsert(); struct lnode *listdel(); struct lnode{ int a; struct lnode *next; }; struct lnode *head; void main() { int n; do{ printf("=====链式表练习=====\n"); printf(" 请选择操作:\n"); printf(" 1、建立链式表\n"); printf(" 2、插入新元素\n"); printf(" 3、删除元素\n"); printf("====================\n"); scanf("%d",&n); switch(n) { case 1:creatlist();break; case 2:listinsert();break; case 3:listdel();break; default:printf("选择错误,请确认输入!\n");break; } }while(1); } struct lnode *creatlist()//建立链表 { struct lnode *p1,*p2,*p0; n=0; head=null; p1=(struct lnode *)malloc(len); printf("请输入初始元素:\n"); scanf("%d",&p1->a); p1->next=null; while(p1->a!=0) {

基于栈的C语言迷宫问题与实现

基于栈的C语言迷宫问题与实现

数据结构与算法实验报告

基于栈的C语言迷宫问题与实现 一.问题描述 多年以来,迷宫问题一直是令人感兴趣的题目。实验心理学家训练老鼠在迷宫中寻找食物。许多神秘主义小说家也曾经把英国乡村花园迷宫作为谋杀现场。于是,老鼠过迷宫问题就此产生,这是一个很有趣的计算机问题,主要利用“栈”是老鼠通过尝试的办法从入口穿过迷宫走到出口。 迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。 一个迷宫可用上图所示方阵[m,n]表示,0表示能通过,1 表示不能通过。现假设耗子从左上角[1,1]进入迷宫,编写算法,寻求一条从右下角

[m,n] 出去的路径。下图是一个迷宫的示意图: 迷宫示意图 二.算法基本思想 迷宫求解问题是栈的一个典型应用。基本算法思想是:在某个点上,按照一定的顺序(在本程序中顺序为上、右、下、左)对周围的墙、路进行判断(在本程序中分别用1、0)代替,若周围某个位置为0,则移动到该点上,再进行下一次判断;若周围的位置都为1(即没有通路),则一步步原路返回并判断有无其他通路,然后再次进行相同的判断,直到走到终点为止,或者确认没有任何通路后终止程序。

要实现上述算法,需要用到栈的思想。栈里面压的是走过的路径,若遇到死路,则将该位置(在栈的顶层)弹出,再进行下一次判断;若遇到通路,则将该位置压栈并进行下一次判断。如此反复循环,直到程序结束。此时,若迷宫有通路,则栈中存储的是迷宫通路坐标的倒序排列,再把所有坐标顺序打印后,即可得到正确的迷宫通路。 三.程序具体部分的说明 1.迷宫的生成 根据题目的要求,迷宫的大小是自定义输入 的。所以在程序中用malloc申请动态二维 数组。数组中的元素为随机生成的0、1。数组周围一圈的元素全部定义为1,以表示边 界。 2.栈的C语言实现 为了实现栈的功能,即清空、压栈、弹出、返回栈顶元素,在程序中编写了相应的函 数。

数据结构(栈及队列)实验报告 C语言版

XXXX学院 计算机课程实验报告(201X~201X年度第X学期) 专业 课程数据结构 班级 组别 教师 琼州学院电子信息工程学院制

实验报告填写说明 1、填写一律用钢笔或圆珠笔填写,要求字迹工整,条理 清晰。 2、“实验题目”可以填写章节名称或用文字表述。 3、“实验目的”要逐条列出,“实验内容”以简练的文 字进行概括。 4、“附注”处填写实验注意事项或调试过程,以及实验 中出现的异常情况和解决方法。 5、“教师批阅”处有课任老师填写评语,给出实验成绩, 并作为平时成绩,参与期末成绩总评。 6、封面和实验报告填写说明正反面打印在一张纸上。 201X年XX月XX日

实验项目:栈及队列的链式和线性存储以及相关操作实现实验目的: 1.掌握数据结构中栈及队列的链式和线性存储结构操作; 2.了解数据结构中栈及队列的基本操作原理 3.掌握C语言中基本程序设计的方法. 4.掌握基本测试方法。 实验仪器: 计算机、C语言版数据结构相关实验题集、编写程序软件 实验规划:(包括函数说明、公共变量说明、测试说明等) 公共变量声明: #include #include #define OK 1 #define ERROR 0 函数说明: /****************************** Ⅰ、栈的链式存储以及相关操作实现 *******************************/ typedef struct stack { int data; struct TYPE *next; } ElemType; 栈的初始化: 1.ElemType* InitStack(); 进栈: 2.int Push(ElemType *head,int e); 出栈: 3.int Pop(ElemType *head,int *e); 显示: 4.int DisplayStack(ElemType *Head); 返回顶元素: 5.int Gettop(ElemType *head);

c语言栈队列链表算法代码实现

#include<> #define null 0 #define len sizeof(struct lnode) int n; struct lnode *creatlist(); struct lnode *listinsert(); struct lnode *listdel(); struct lnode{ int a; struct lnode *next; }; struct lnode *head; void main() { int n; do{ printf("=====链式表练习=====\n"); printf(" 请选择操作:\n"); printf(" 1、建立链式表\n"); printf(" 2、插入新元素\n"); printf(" 3、删除元素\n"); printf("====================\n"); scanf("%d",&n); switch(n) { case 1:creatlist();break; case 2:listinsert();break; case 3:listdel();break; default:printf("选择错误,请确认输入!\n");break; } }while(1); } struct lnode *creatlist()//建立链表 { struct lnode *p1,*p2,*p0; n=0; head=null; p1=(struct lnode *)malloc(len); printf("请输入初始元素:\n"); scanf("%d",&p1->a); p1->next=null; while(p1->a!=0) {

实用C语言栈的表示与实现实例详解分析

C语言栈的表示与实现实例详解分析 1.基本概念: C语言的栈是指限定仅在表尾进行插入和删除操作的线性表。 栈作为C语言中一种常用的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。 在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。在i386机器中,栈顶由称为esp的寄存器进行定位。压栈的操作使得栈顶的地址减小,弹出的操作使得栈顶的地址增大。 栈在程序的运行中有着举足轻重的作用。最重要的是栈保存了一个函数调用时所需要的维护信息,这常常称之为堆栈帧或者活动记录。堆栈帧一般包含如下几方面的信息:

(1)函数的返回地址和参数 (2)临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量 2.实现代码: #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ }SqStack; /* 顺序栈*/Status InitStack(SqStack *S) { /* 构造一个空栈S */ (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!(*S).base) exit(OVERFLOW); /* 存储分配失败*/ (*S).top=(*S).base; (*S).stacksize=STACK_INIT_SIZE; return OK; } Status DestroyStack(SqStack *S) { /* 销毁栈S,S不再存在*/ free((*S).base); (*S).base=NULL; (*S).top=NULL; (*S).stacksize=0; return OK; } Status ClearStack(SqStack *S) { /* 把S置为空栈*/ (*S).top=(*S).base; return OK; } Status StackEmpty(SqStack S) { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */ if(S.top==S.base) return TRUE; else return FALSE; } int StackLength(SqStack S) { /* 返回S的元素个数,即栈的长度*/ return S.top-S.base; } Status GetTop(SqStack S,SElemType *e) { /* 若栈不空,则用e返回S的

相关文档
最新文档