一、实训名称
栈的应用
二、实训目的
1.学会栈基础知识、结构特点、存贮结构
2.练习使用栈的结构特点和基本操作
3.学会使用栈处理应用问题的方法
三、实训要求
1.用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值。
2.栈可以顺序栈也可以用链式栈实现,鼓励大家用两种方式实现。
3.创建栈时,数据从键盘输入整形数据
4.栈类型定义和或各种操作的实现,可以用教材给出的方法,也可以自己设计。
实现效果:
顺序栈
链栈
顺序栈
#include<stdio.h>
#include<stdlib.h>
#define N 10
#define M 5
//抽象数据类型
typedef struct SeqStack{
int *base;
int *top;
int size ;
}SeqStack;
//制作一个栈
void Initstack(SeqStack *S){
S->base=(int*)malloc(N*sizeof(int));
if(!S->base) exit(-1);
S->top=S->base;
S->size=N;
}
//入栈
void Pushstack(SeqStack *S,int e){
if(S->top-S->base>=S->size){
S->base=(int*)realloc(S->base,(S->size+M)*sizeof(int));
S->size+=M;
}
*S->top++=e;
}
//出栈
int Popstack(SeqStack *S){
return *--S->top;
}
//判断栈是否为空
int Emptystack(SeqStack S){
if(S.base>=S.top) return 1;
else return 0;
}
//破坏掉一个栈
void Destroystack(SeqStack *S){
free(S->base);
}
int main(){
int n,m;
SeqStack S;
int e;
while(1)
{
printf("请输入要转化的数值:\n");
scanf("%d",&n);
if(n<0) break;
printf("输入要转换的数制:\n");
scanf("%d",&m);
Initstack(&S);
//重点,转化的关键
while(n)
{
Pushstack(&S,n%m);
n=n/m;
}
while(!Emptystack(S))
{
e=Popstack(&S);
printf("%d",e);
}
printf("\n");
Destroystack(&S);
}
return 0;
}
链栈
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//节点类型
typedef struct node{
int data;
struct node *next;
}NODE,*PNODE;
typedef struct stack{
PNODE top;
PNODE bottom;
}STACK,*PSTACK;
//栈的初始化
void init_stack(PSTACK ps){
ps->top=(PNODE)malloc(sizeof(NODE));
//动态分配node类型的节点,把首地址付给ps->top;
if(ps->top==NULL)
printf("动态内存分配失败!");
else
{
ps->top->next=NULL;
ps->bottom=ps->top;
}
return;
}
//入栈操作
void push_stack(PSTACK ps,int e)
{
PNODE p=(PNODE)malloc(sizeof(NODE));//动态创建一个新的节点
p->data=e;
p->next=ps->top;
ps->top=p;
return;
}
void travel_stack(PSTACK ps)
{
PNODE p=ps->top;
while(p!=ps->bottom)
{
printf("%d",p->data);
p=p->next;
}
printf("\n");
return;
}
//出栈操作
void pop_stack(PSTACK ps,int *pval)
{
PNODE q=ps->top;
*pval=q->data;
ps->top=q->next;
free(q);
return ;
}
bool is_empty(PSTACK ps)
{
if(ps->top==ps->bottom)
return true;
else
return false;
}
void swap_stack(PSTACK ps,int x,int y)
{
PNODE p=ps->top;
while(x!=0)
{
push_stack(ps,x%y);
x=x/y;
}
return;
}
int main(){
STACK s;
int x,y;
init_stack(&s);
printf("请输入想要转换的数值:\n");
scanf("%d",&x);
printf("请输入想要转换的进制:\n");
scanf("%d",&y);
swap_stack(&s,x,y);
travel_stack(&s);
return 0;
}