数据结构(实验C语言版)
栈的应用
一、实验目的
- 熟悉栈的定义和栈的基本操作;
- 掌握栈的基本运算;
- 掌握栈的应用。
二、实验环境
硬件环境要求: PC 机(单机) 使用的软件名称、版本号以及模块: VS2010 等。
三、实验内容
1、编写一个程序,利用栈的先进后出的特点,实现对于输入的任意一个非负十进制整数,打印输出与其等值的二进制数。
void conversion( )
{
InitStack(S);
scanf(“%d”,N);
while(N)
{
Push(S,N%2);/*余数压栈*/
N=N/2;
}
while(!StackEmpty(S))
{
Pop(S,e); /*出栈*/
Printf(“%d”,e);
}
}
四、实验要求
1、用 VS2010 工具创建文件或程序,输入代码后,进行编译运行或在控制台 执行。
2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。
【核心算法提示】
顺序栈结构描述如下:
typedef struct Stack
{
Elemtype *top;
Elemtype *base;
int stacksize;
}SqStack;
初始化栈:
void IntiStack(sqstack *s)
{
s->base = (Elemtype*)malloc(stack_init_size*sizeof(Elemtype));
if (!s->base)
exit(0);
s->top = s->base; //设置栈为空
s->stacksize = stack_init_size;
}
入栈:
int Push(sqstack* s, Elemtype e)
{
if (s->top - s->base >= s->stacksize) //判断是否栈满
{
s->base = (Elemtype*)realloc(s->base, (s->stacksize + stack_increment)*sizeof(Elemtype));
if (!s->base)
exit(0);
s->top = s->base + s->stacksize; //重新设置栈顶
s->stacksize += stack_increment; //重新设置栈的大小
}
*(s->top) = e;
s->top++;
return 1;
}
出栈:
void Pop(sqstack* s, Elemtype *e)
{
if (s->top == s->base) //如果栈为空
return;
*e = *--(s->top);
}
源代码
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 10
#define STACKINCREASEMENT 2
typedef struct
{
int *base;
int *top;
int stacksize;
}sqstack;//sequence:序列
void initstack(sqstack *s)
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!s->base)
{printf("创建空间失败");exit(0);}
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
void push(sqstack *s,int e)
{
if(s->top-s->base>s->stacksize)
{
s->base=(int *)realloc(s->base,(s->stacksize+STACKINCREASEMENT)*sizeof(int));
if(!s->base)
{
printf("创建空间失败");
exit(0);
}
s->top=s->base+s->stacksize;
s->stacksize=s->stacksize+STACKINCREASEMENT;
}
*s->top++=e;//int型指针++,指向 物理空间上的跨度为int大小的 地址
//*s->tope=e;s->tope++;
}
int pop(sqstack *s)
{
int e;
if(s->top==s->base)
printf("栈为空");
e=*--s->top;
//s->top--; e=*s->top;
return e;
}
void conversion(sqstack *s,int e)//10进制转换成二进制
{
int temp;
void initstack(sqstack *s);
void push(sqstack *s,int e);
int pop(sqstack *s);
initstack(s);
while(e)
{
push(s,e%2);
e=e/2;
}
while(s->base!=s->top)
{
temp=pop(s);
printf("%d ",temp);
}
}
//void main ()
int main ()
{
void conversion(sqstack *s,int e);
int e;
sqstack s;//这里塞的不好,要全放在conversion
printf("输入一个十进制数:");
scanf("%d",&e);
printf("输出相应的二进制数:");
conversion(&s,e);
}