栈的使用和基于堆栈的进制转换

chanra1n2019年10月21日算法70661

题目:

I9{11ZIFJ@PRY9B@PQD6{CQ.png

解答:

#include<stdio.h>
#include <stack>
#define MAXLEN 100 //MAXLEN最大长度 
std::stack <int>v;
typedef struct
{
	int data[MAXLEN];//定义char类型数组date[100] 
	int top;//定义标志 
}SeqStack;//声明栈结构体LinkStack

/*初始化顺序栈*/
void InitStack(SeqStack *S){
	S->top = -1;  //声明栈从0开始,最大元素99 
}
/*判断栈是否为空*/
int EmptyStack(SeqStack *S){
	if(S->top == -1)
	    return 1;
	else
	    return 0;
}
/*判断栈满*/
int FullStack(SeqStack *S){
	if(S->top == MAXLEN-1)
	    return 1;
	else
	    return 0;
}
/*进栈*/
int Push(SeqStack *S, int x){
	if(FullStack(S)){
		printf("栈满,不能进栈!\n");
		return 0;
	}
	else{
		S->top++;
		S->data[S->top]=x;
		return 1;
	}
}
/*出栈*/
int Pop(SeqStack *S, int *x){
	if(EmptyStack(S)){
		printf("栈空,不能出栈!\n");
		return 0;
	}
	else{
		*x = S->data[S->top];
		S->top--;
		return 1;
	}
}
/*取栈顶元素*/
int GetTop(SeqStack *S, int *x){
	if(EmptyStack(S)){
		printf("栈空,取栈顶元素失败!\n");
		return 0;
	}
	else{
		*x = S->data[S->top];
		return 1;
	}
}
/*进制转换*/
void Change(int n,int d){
	while(n)
    {
        v.push(n % d);
        n = n / d;
    }
    while(!v.empty())
    {
    	if(v.top()>=10)
    	printf("%c", v.top()+0x37);
    	else
		printf("%d", v.top());
        v.pop();///pop的返回值类型为空
    }
}
void Menu()
{
	    printf("\n       顺序栈的各种操作");
		printf("\n==========================================");
		printf("\n|      1--始化顺序栈                     |");
		printf("\n|      2--调用入栈函数                   |");
		printf("\n|      3--调用出栈函数                   |");
		printf("\n|      4--取栈顶元素                     |");
		printf("\n|      5--调用进制转换函数               |");
		printf("\n==========================================");	
		printf("\n请输入菜单号(0-5):");
}
main(){
	int i,n,flag;
	SeqStack S;
	int x;
	char ch1,ch2,a;
	ch1 = 'y';
	while(ch1 == 'y' || ch1 == 'Y'){
		Menu();
		scanf(" %c",&ch2);
		getchar();
		switch(ch2){
			case '1':
				InitStack(&S);/*初始化顺序栈*/
				printf("栈的初始化完成!\n");
				break;
			case '2':
				printf("输入要入栈的元素个数:\n");
				scanf("%d",&n);
				printf("输入%d个入栈的字符:",n);
				for(i=0; i<n; i++){
					scanf(" %c",&x); 
					flag = Push(&S,x);/*进栈*/
				}
				if(flag == 1)
					printf("入栈成功!\n");
				break;
			case '3':
			    printf("输入要出栈的元素个数:\n");
			    scanf("%d",&n);
			    printf("出栈的元素为:\n");
			    for(i=0; i<n; i++){
			    	flag = Pop(&S,&x);
			    	printf("%c",x);
				}
				if(flag == 1)
				    printf("出栈成功!\n");
				else
				    printf("出栈失败!\n");
				break;
			case '4':
				if(flag = GetTop(&S, &x))
				    printf("当前的栈顶元素为%c\n",x);
				break;
			case '5':
				printf("请输入一个十进制数字:\n");
				scanf("%d",&n);
				printf("将这个十进制转换为几进制?");
				scanf("%d",&flag);
				Change(n,flag); 
				break;
			case '0':
				ch1 = 'n';
			    break;
			default:
				printf("输入有误,请输入0-5进行选择!\n");
		}
	}
}


请先 登录 再评论,若不是会员请先 注册