一、实训名称
栈的应用

二、实训目的
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;
 }
posted on 2022-08-28 22:19  热爱技术的小郑  阅读(204)  评论(0编辑  收藏  举报