第1关:栈操作及数进制转换的实现

1.头文件:

#ifndef _STACK_H_
#define _STACK_H_
 
#include <iostream>   //C++语言 
#include <malloc.h>
using namespace std;  //C++语言 

typedef int DataType;

结点结构体+结点结构体指针PNode:top

//采用链式栈 
struct node                 //结点的结构体定义 
{
   DataType        element; //结点的数据域 
   struct node *   next;    //结点的指针域 
};
typedef struct node* PNode;//把struct node*型的结构体用别名PNode表示
                           //PNode n : 定义一个单个节点

3.定义结构体栈+结构体栈指针Stack:s

struct stack       //定义结构体栈
{
	PNode top;     //定义(结点结构体指针类型)栈顶
};
typedef struct stack* Stack;//把struct stack* 型的结构体用别名Stack表示

4.栈空判断:isEmpty(s->top为空)

/*
   函数名:isEmpty 
   函数功能:判定栈是否为空 
   函数参数:栈头结点指针 
   返回值:若栈为空,则返回1,否则返回0
*/

int isEmpty(Stack s)   //int类型的栈空,返回整型1,0
{
    //此处请填写代码,用于实现判定栈是否为空的功能
    /**********  Begin  **********/
   if(s->top==NULL)    return 1;  //栈头节点指针为空
   else                return 0;
                  
    /**********  End  **********/
}

5.创建空栈:createStack

/*
   函数名:createStack 
   函数功能:创建一个空栈,实际上只需要初始化栈头结点 
   函数参数:无 
   返回值:栈头结点指针 
*/
Stack createStack()  
{
   //此处请填写代码,用于创建一个空的链栈
   /**********  Begin  **********/
   Stack s = (Stack)malloc(sizeof(struct node);//分配空间s
   s->top == NULL;                             //(*s).top   栈空
   return s ;                                  //返回s
  
   /**********  End  **********/
}

6.压栈:push

/*
   函数名:push 
   函数功能:向栈中压人一个数据元素值为x 
   函数参数:待压栈的数据元素,栈头结点指针 
   返回值:无
*/
void push(Stack s,DataType x)                   //压栈无返回
{
	//表头作为栈顶,此处请填写代码实现压栈功能
    /**********  Begin  **********/ 
     
    PNode p = (PNode)malloc(sizeof(struct node);//分配空间->结点指针p
    p->element = x;                             //结点数据域:p->element
    p->next    = s->top;                        //结点指针域:p->next
    s->top     = p;                             //类型一致:p
    /**********  End  **********/
}

7.弹栈:pop

/*
   函数名:pop 
   函数功能:弹出栈顶元素并返回元素值 
   函数参数:栈头结点指针 
   返回值:栈顶元素的值 
*/
DataType pop(Stack s) 
{
   //此处请填写代码实现出栈并返回栈顶元素的功能,若栈为空,则返回-1
   /**********  Begin  **********/
   if(s->top == NULL)    return -1;//栈空
   else
   {
      PNode p  = s->top;             //p
      DataType   temp;               //定义temp
      temp     = p->element;         //p->element栈顶元素
      s->top   = s->top->next;       //栈顶移动
      free(p);                       //释放空间

      return temp;

   }  
   
   /**********  End  **********/
}

8.十进制转二进制:convert10to2

/*
   函数名:convert10to2
   函数功能:将十进制数x转换为二进制并输出 
   函数参数:十进制数x 
   返回值:无 
*/
void print(Stack s)           //print函数
{
	PNode p = s->top;         //栈顶
	while(!isEmpty(s))        //s不为空栈
	{
		printf("%d ", pop(s));//打印栈顶元素
		p = p->next;          //栈顶移动
	} 
}
void convert10to2(int x)
{
	//此处请填写代码实现将参数x转换为二进制并输出的功能,请使用上述栈的基本操作实现
    /**********  Begin  **********/
    Stack s = createStack();    //创建栈s
    
    int m = x % 2;              //余数m
    push(s,m);                  //压栈m
    
    int n = x/2;                //除数n
    int a = s->top->element;    //栈顶元素a

    while(n != 0)               //除数存在
    {
       m = n % 2;               //n的余数m
       n = n /2 ;               //n的除数n
       push(s,m);               //压栈m
    }
    
    print(s);                   //输出栈顶元素
    
    /**********  End  **********/
}

完整代码(可以直接运行)

第一关:

#ifndef _STACK_H_
#define _STACK_H_
#include <stdio.h>
#include <iostream>
#include <malloc.h>
using namespace std;

typedef int DataType;
 
//采用链式栈 
struct node
{
   DataType element;  //数据元素 
   struct node * next; //指向下一个数据元素的指针 
};

typedef struct node * PNode;

struct stack 
{
	PNode top;
};
typedef struct stack * Stack;
/*
   函数名:isEmpty 
   函数功能:判定栈是否为空 
   函数参数:栈头结点指针 
   返回值:若栈为空,则返回1,否则返回0
*/

int isEmpty(Stack s) 
{
    //此处请填写代码,用于实现判定栈是否为空的功能
    /**********  Begin  **********/
    if (s->top == NULL)    
		return 1;
    else
		return 0;
    /**********  End  **********/
}

 

/*
   函数名:createStack 
   函数功能:创建一个空栈,实际上只需要初始化栈头结点 
   函数参数:无 
   返回值:栈头结点指针 
*/
Stack createStack()  
{
    //此处请填写代码,用于创建一个空的链栈
    /**********  Begin  **********/
    //printf("2");
    Stack s = (Stack)malloc(sizeof(struct stack));
    s->top == NULL;
   	return s; 
    /**********  End  **********/
}

/*
   函数名:push 
   函数功能:向栈中压人一个数据元素值为x 
   函数参数:待压栈的数据元素,栈头结点指针 
   返回值:无
*/
void push(Stack s,DataType x) 
{
	//表头作为栈顶,此处请填写代码实现压栈功能
    /**********  Begin  **********/ 
   	PNode p = (PNode)malloc(sizeof(struct node));
   	p->element  = x;
   	p->next = s->top;
   	s->top = p;
    /**********  End  **********/
}

/*
   函数名:pop 
   函数功能:弹出栈顶元素并返回元素值 
   函数参数:栈头结点指针 
   返回值:栈顶元素的值 
*/
DataType pop(Stack s) 
{
   //此处请填写代码实现出栈并返回栈顶元素的功能,若栈为空,则返回-1
   /**********  Begin  **********/
   if(s->top == NULL)    return -1;
   else
   {
      PNode p = s->top;
      DataType temp;
      temp = p->element;
      s->top = s->top->next;
      free(p);

      return temp;

   }  
   
   /**********  End  **********/
}

/*
   函数名:convert10to2
   函数功能:将十进制数x转换为二进制并输出 
   函数参数:十进制数x 
   返回值:无 
*/
void print(Stack s)
{
	PNode p = s->top;
	while(!isEmpty(s))
	{
		printf("%d", pop(s));
		p = p->next;
	} 
}
void convert10to2(int x)
{
	//此处请填写代码实现将参数x转换为二进制并输出的功能,请使用上述栈的基本操作实现
    /**********  Begin  **********/
    Stack s = createStack();
    int m = x % 2;
    push(s,m);
    int n = x/2;
    int a = s->top->element;
	//printf("2");

    while(n != 0)
    {
       m = n % 2;
       n = n /2 ;
       push(s,m);
    }
    
    print(s);
    
    /**********  End  **********/
}


#endif
//主函数:
#include "stack.h"

int main(void)
{
	int x;
    cin>>x;
    convert10to2(x);
}