有些函数需要提前准备
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 6int 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");
}