【数据结构】栈的入栈和出栈操作,并实现栈的进制转换应用

/*
	实验3:输入一组整型元素序列,建立一个链栈,
	实现该链栈的入栈和出栈操作,并实现10进制到2进制的转化。
*/
#include<stdio.h> 
#include<stdlib.h>  


#define STACK_INIT_SIZE 100    //存储空间初始分配量
#define STACKINCREMENT 10      //存储空间分配增量

typedef int SElemType;
typedef int Status;

#define OVERFLOW 0 
#define OK 1 
#define ERROR 0  
 
typedef struct {  
	SElemType *base;   //在栈构造之前和销毁之后,base的值为NULL
	SElemType *top;    //栈顶指针
	int stacksize;     //当前已分配的存储空间,以元素为单位
}SqStack; 

//构造一个空栈
Status InitStack(SqStack &S) { 
	S.base = (SElemType * )malloc(STACK_INIT_SIZE * sizeof(SElemType));  
	if(!S.base)   exit(OVERFLOW); //存储分配失败
	S.top = S.base;  
	S.stacksize = STACK_INIT_SIZE;  
	return OK; 
}

//获得栈顶元素
Status GetTop(SqStack S,SElemType &e) { 
	if(S.top==S.base)  //判断栈是否为空
		return ERROR;  
	e = *(S.top-1);    //用e返回S栈顶元素,并返回OK。 
	return OK; 
}

//进栈
Status Push(SqStack &S,SElemType e) {  //插入元素e为栈顶元素
	if(S.top-S.base >= S.stacksize)  {  //如果栈满,追加存储空间  
		S.base=(SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof (SElemType));   
		if(!S.base)    exit(OVERFLOW); //如果存储空间分配失败,退出
		S.top = S.base + S.stacksize;   
		S.stacksize += STACKINCREMENT;  
	}  
	*S.top++ = e;  
	return OK; 
 }

//出栈
Status Pop(SqStack &S,SElemType &e){ 
	if(S.top==S.base)  //判断栈是否为空,用e返回出栈的值
		return ERROR; 
	e = *--S.top;  
	return OK; 
}

//进制转换
void conversion(int N,int i) { 
	SqStack S;  
	int e;  
	InitStack(S);        //构造空栈
	while(N)  {  
		Push(S,N % i);    //入栈
		N = N / i;  
	}   
	while(S.top != S.base) {   //如果栈不为空 
		Pop(S,e);			   //出栈 		
		if(e<10){
			printf("%d",e);  
		}else{
			printf("%d",e+55);  
		}	
	} 
	printf("\n"); 
} 
void main() { 
	int menu,i;
	int N;
	do{
		printf("*********** Menu ******************\n"); 
		printf("\n");
		printf("\n");
		printf("	1.使用栈进行数制的转换;\n");
		printf("	2.退出;\n");
		printf("\n");
		printf("\n");
		printf("********** Author: ZMH ************\n");
		scanf("%d",&menu);
		switch(menu){
			case 1:
					do{
						printf("请选择你所要转换的进制\n");
						printf("\n");
						printf("1.十进制转换为二进制\t");
						printf("2.十进制转换为八进制\t");
						printf("3.退出");
						printf("\n");
						scanf("%d",&i);
						switch(i){
						case 1:printf("请任意输入一个非负十进制整数:");
							scanf("%d",&N);
							printf("\n");
							printf("十进制数%d转换为二进制为:",N); 
							conversion(N,2);
							printf("\n");
							break;
						case 2:
							printf("请任意输入一个非负十进制整数:");
							scanf("%d",&N);
							printf("\n");
							printf("十进制数%d转换为八进制为:",8);
							printf("\n");
							break;
						case 3:exit(0);
						}
					}while(i);
		}
	}while(menu);
} 



By Mr.Z

相关文章

【啊哈!算法】算法3:最常用的排序——快速排序       ...
匿名组 这里可能用到几个不同的分组构造。通过括号内围绕的正...
选择排序:从数组的起始位置处开始,把第一个元素与数组中其...
public struct Pqitem { public int priority; ...
在编写正则表达式的时候,经常会向要向正则表达式添加数量型...
来自:http://blog.csdn.net/morewindows/article/details/6...