一、要求:
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:
代码仅代表本人初识数据结构时思路。