当前位置:首页 > 算法 > 正文内容

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

chanra1n5年前 (2019-10-21)算法11036

题目:

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");
		}
	}
}


扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://myfpga.cn/index.php/post/27.html

分享给朋友:
返回列表

没有更早的文章了...

下一篇:顺序表算法应用

“栈的使用和基于堆栈的进制转换” 的相关文章

常见算法的C语言实现(带题目、分析和答案) 穷举 递归 迭代 递推 分治 回溯 动态规划 贪心

常见算法的C语言实现(带题目、分析和答案) 穷举 递归 迭代 递推 分治 回溯 动态规划 贪心

1.1   基本思想1.1.1  穷举穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。a)      题一查找数组中的两个元素,它们的和等于给定的目标值。给定一个包含 n 个整数的数组和一个目标值,找出...

(LeetCode刷题)1. 两数之和

(LeetCode刷题)1. 两数之和

题目解答一:/**  * Note: The returned array must be malloced, assume caller calls free(). &nbs...

(LeetCode刷题)2. 两数相加

(LeetCode刷题)2. 两数相加

题目解答一:简单实现思路:先遍历完两个链表,把各自的数字存入两个数组,然后对应位置的数相加,若结果大于10就进位到更高位的数。/**  * Definition for singly-linked list->  * s...

(LeetCode刷题)3. 无重复字符的最长子串

(LeetCode刷题)3. 无重复字符的最长子串

题目:解法一:class Solution(object):     def lengthOfLongestSubstring(self,s):        &nb...