数据结构②:栈与队列的应用

一、要求:

1)输入一个十进制数,利用栈操作,将该数转换成n进制数。
2)输入一个表达式,表达式中包括三种括号“()”、“[]”和“{}”,判断该表达式的括号是否匹配。

二、思路:

1)进制转换

任意一个十进制正整数n,都能转化为一个d进制正整数。该算法基于原理n=(n/d)*d+n%d 。在n不为0的前提下,执行循环操作:
让n%d的结果入栈,并执行n=n/d改变n值。
计算结束后,再将栈中的元素依次出栈,即可得到从高位到低位的输出结果。此处要考虑两种情况,一种是将十进制转为低于10的进制的情况,另一种是高于10的进制的情况。

2)判断括号是否匹配

设置一个空栈,扫描给定的表达式,若遇到左括号则将其入栈等候配对,若遇到右括号,首先判断栈是否为空,若为空,说明给定的表达式中右括号多了;若不为空,则将栈顶元素(左括号)出栈,让其与右括号配对。当给定的表达式扫描结束后,若栈空,说明给定的表达式中括号匹配,若栈非空,说明给定的表达式中左括号多了,表达式中的括号不匹配。

三、代码和结果:

1)进制转换:

#include<stdio.h>
#include<stdlib.h>
#define StackInitSize 100  //初始大小
#define StackIncrement 10 //存储空间增量

typedef struct{
	int *base;               //顺序栈的存储空间基址
	int top;               //栈顶指针
	int stacksize;			//存储空间大小
}SqStack;                 //顺序栈的类型

//******初始化********//
void InitStack(SqStack &S){
	S.base = (int*)malloc(StackInitSize*sizeof(int));
	if(!S.base)
		return ;
	S.top = 0;      //栈顶指针初值为0
	S.stacksize = StackInitSize;     //空间大小初始值
}

//********判空**********//
int StackEmpty(SqStack S){
	if(S.top==0)
		return 1;
	return 0;
}

//********入栈 ********//
void Push(SqStack &S,int e){
	if(S.top>=S.stacksize){
		S.base = (int*)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(int));
		if(!S.base)
			return ;
		S.stacksize += StackIncrement; 
	}
	S.base[S.top++] = e;
}


//*********出栈********//
void Pop(SqStack &S,int &e){
	if(S.top==0)
		return ;
	e = S.base[--S.top];
}

//*******十进制正整数转换为d进制正整数*********//
void Conversion(SqStack &S,int n,int d){
	int e;
	while(n){
		Push(S,n%d);
		n=n/d;
		}
	while(!StackEmpty(S)){
		Pop(S,e);
		if(e==10)
			printf("%c",'A');
		else if(e==11)
			printf("%c",'B');
		else if(e==12)
			printf("%c",'C');
		else if(e==13)
			printf("%c",'D');
		else if(e==14)
			printf("%c",'E');
		else if(e==15)
			printf("%c",'F');
		else
			printf("%d",e);
	}
}
void main(){
	int a,b;
	SqStack S;
	InitStack(S);
	printf("请输入一个十进制数:\n");
	scanf("%d",&a);
	printf("请输入要转换为几进制数:\n");
	scanf("%d",&b);
	Conversion(S,a,b);
	printf("\n");
}

结果:

转为8进制:
在这里插入图片描述

转为2进制:
在这里插入图片描述

转为16进制:
在这里插入图片描述
2)判断括号是否匹配

#include<stdio.h>
#include<stdlib.h>
#define StackInitSize 100  //初始大小
#define StackIncrement 10 //存储空间增量

typedef struct{
	int *base;               //顺序栈的存储空间基址
	int top;               //栈顶指针
	int stacksize;			//存储空间大小
}SqStack;                 //顺序栈的类型

//******初始化********//
void InitStack(SqStack &S){
	S.base = (int*)malloc(StackInitSize*sizeof(int));
	if(!S.base)
		return ;
	S.top = 0;      //栈顶指针初值为0
	S.stacksize = StackInitSize;     //空间大小初始值
}

//********判空**********//
int StackEmpty(SqStack S){
	if(S.top==0)
		return 1;
	return 0;
}

//********入栈 ********//
void Push(SqStack &S,char e){
	if(S.top>=S.stacksize){
		S.base = (int*)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(int));
		if(!S.base)
			return ;
		S.stacksize += StackIncrement; 
	}
	S.base[S.top++] = e;
}

//*********出栈********//
void Pop(SqStack &S,char &e){
	if(S.top==0)
		return ;
	e = S.base[--S.top];
}

//*******判断括号是否匹配********//
int BracketsCheck(SqStack &S,char *str){
	char ch,*p;
	p = str;
	while(*p!='\0'){
		if(*p=='{' || *p=='[' || *p=='(')
			Push(S,*p);
		else if(*p=='}' || *p==']' || *p==')'){
			if(StackEmpty(S))    //右括号多
				return 0;
			Pop(S,ch);     //栈顶元素出栈配对
			if(*p=='}' && ch !='{')
				return 0;
			if(*p==']' && ch !='[')
				return 0;
			if(*p==')' && ch !='(')
				return 0;
		}
		p++;
	}
	if(!StackEmpty(S))    //左括号多
		return 0;
	return 1;
}
void main(){
	char st[20];
	int a;
	SqStack S;
	InitStack(S);
	printf("请输入含括号的表达式:\n");
	scanf("%s",st);
	a=BracketsCheck(S,st);
	if(a==1)
		printf("括号匹配\n");
	else
		printf("括号不匹配\n");
}

结果:
在这里插入图片描述
在这里插入图片描述


Direction:

代码仅代表本人初识数据结构时思路。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cloudcodes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值