有些函数需要提前准备
typedef struct node{
int data;
struct node* next;
}node;
typedef struct{
int size;
node* top;
}toplist;
//进栈函数,传入第一个参数为记录栈顶的结构体指针,第二个参数为要进去的节点指针
bool push(toplist* managelist,node* new);
//出栈函数,传入第一个参数为记录栈顶的结构体指针,第二个参数出栈节点的记录的数,用指针记录
bool pop(toplist* managelist,int* num);
//插入节点且将num赋值给该节点的数值
node* iniList(int num);
//记录栈顶结构体函数初始化,size = 0,top->NULL
toplist *managelist_init(void);
栈在单向链表中,并实现十进制转为二进制的操作
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* next;
}node;
typedef struct{
int size;
node* top;
}toplist;
bool push(toplist* managelist,node* new);
bool pop(toplist* managelist,int* num);
node* iniList(int num);
toplist *managelist_init(void);
int main(void)
{
int data = -1;
toplist* managelist = managelist_init();
//此为测试代码,可以删除或者忽略
/*
push(managelist,iniList(1));
printf("%p\n",managelist->top);
push(managelist,iniList(2));
printf("%p\n",managelist->top);
push(managelist,iniList(3));
printf("%p\n",managelist->top);
push(managelist,iniList(4));
printf("%p\n",managelist->top);
printf("%d \t %d \t %p\n",data,managelist->size,managelist->top);
printf("before pop!\n");
pop(managelist,&data);
printf("%d \t %d \t %p\n",data,managelist->size,managelist->top);
*/
//无符号类型,方便转化负数的二进制
unsigned int number = -1;
while(1)
{
printf("enter a decimal number:");
scanf("%d",&number);
if(number == 0)
{
push(managelist,iniList(number));
}
else
{
while(number != 0)
{
push(managelist,iniList(number%2));
number = number/2;
}
}
while(managelist->size != 0)
{
pop(managelist,&data);
printf("%d",data);
}
printf("\n");
}
return 0;
}
bool push(toplist* managelist,node* new)
{
new->next = managelist->top;
managelist->top = new;
managelist->size++;
return true;
}
bool pop(toplist* managelist,int* num)
{
if(managelist->top == NULL || managelist->size == 0)
{
return false;
}
node* tmp = managelist->top;
*num = managelist->top->data;
managelist->top = managelist->top->next;
managelist->size--;
free(tmp);
return true;
}
node* iniList(int num)
{
node* p = (node*)malloc(sizeof(node));
if(p == NULL)
{
printf("allot space is failure!\n");
return NULL;
}
p->data = num;
p->next = NULL;
return p;
}
toplist *managelist_init(void)
{
toplist* p = (toplist*)malloc(sizeof(toplist));
if(p == NULL)
{
printf("allot space is failure!\n");
}
p->size = 0;
p->top = NULL;
return p;
}
栈在数组中实现
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define HIGH 6
int stack_arr[HIGH] = {0};
int flag = -1;
bool push(int stack_arr[],int num);
bool pop(int stack_arr[],int* num);
int main(void)
{
int num = -1;
push(stack_arr,1);
push(stack_arr,2);
push(stack_arr,4);
push(stack_arr,3);
pop(stack_arr,&num);
printf("%d \t %d\n",num,flag);
return 0;
}
bool push(int stack_arr[],int num)
{
if(flag == HIGH-1)
{
return false;
}
stack_arr[++flag] = num;
return true;
}
bool pop(int stack_arr[],int* num)
{
if(flag == -1)
{
return false;
}
*num = stack_arr[flag--];
return true;
}
十进制转二进制函数、十进制转八进制函数:
void dec_to_bin(toplist* managelist,unsigned int number)
{
int data = -1;
if(number == 0)
{
push(managelist,iniList(number));
}
else
{
while(number != 0)
{
push(managelist,iniList(number%2));
number = number/2;
}
}
while(managelist->size != 0)
{
pop(managelist,&data);
printf("%d",data);
}
printf("\n");
}
void dec_to_oct(toplist* managelist,unsigned int number)
{
int data = -1;
if(number == 0)
{
push(managelist,iniList(number));
}
else
{
while(number != 0)
{
push(managelist,iniList(number%8));
number = number/8;
}
}
while(managelist->size != 0)
{
pop(managelist,&data);
printf("%d",data);
}
printf("\n");
}
直接使用
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* next;
}node;
typedef struct{
int size;
node* top;
}toplist;
bool push(toplist* managelist,node* new);
bool pop(toplist* managelist,int* num);
node* iniList(int num);
toplist *managelist_init(void);
void dec_to_bin(toplist* managelist,unsigned int number);
void dec_to_oct(toplist* managelist,unsigned int number);
int main(void)
{
int data = -1;
toplist* managelist = managelist_init();
unsigned int number = -1;
while(1)
{
printf("enter a decimal number:");
scanf("%d",&number);
dec_to_bin(managelist,number);
dec_to_oct(managelist,number);
}
return 0;
}
bool push(toplist* managelist,node* new)
{
new->next = managelist->top;
managelist->top = new;
managelist->size++;
return true;
}
bool pop(toplist* managelist,int* num)
{
if(managelist->top == NULL || managelist->size == 0)
{
return false;
}
node* tmp = managelist->top;
*num = managelist->top->data;
managelist->top = managelist->top->next;
managelist->size--;
free(tmp);
return true;
}
node* iniList(int num)
{
node* p = (node*)malloc(sizeof(node));
if(p == NULL)
{
printf("allot space is failure!\n");
return NULL;
}
p->data = num;
p->next = NULL;
return p;
}
toplist *managelist_init(void)
{
toplist* p = (toplist*)malloc(sizeof(toplist));
if(p == NULL)
{
printf("allot space is failure!\n");
}
p->size = 0;
p->top = NULL;
return p;
}
void dec_to_bin(toplist* managelist,unsigned int number)
{
int data = -1;
if(number == 0)
{
push(managelist,iniList(number));
}
else
{
while(number != 0)
{
push(managelist,iniList(number%2));
number = number/2;
}
}
while(managelist->size != 0)
{
pop(managelist,&data);
printf("%d",data);
}
printf("\n");
}
void dec_to_oct(toplist* managelist,unsigned int number)
{
int data = -1;
if(number == 0)
{
push(managelist,iniList(number));
}
else
{
while(number != 0)
{
push(managelist,iniList(number%8));
number = number/8;
}
}
while(managelist->size != 0)
{
pop(managelist,&data);
printf("%d",data);
}
printf("\n");
}