1.利用栈结构,编写程序将十进制数转换成二进制数或八进制数或十六进制,由用户选择转换成哪种进制。
说明:十进制数值转换成二进制使用辗转相除法将一个十进制数值转换成二进制数值。即用该十进制数值除以2,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的二进制数值。十进制数值转换成八进制、十六进制算法类似。转换算法要求用一个函数完成。
2.假设算术表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([][])或[()]等为正确格式,而[(]或()))或 [())均为不正确的格式。请使用栈结构,编写算法检验某表达式中的括号是否匹配,要求区分下面四种情况,并测试你的算法是否正确。测试表达式为:
(1) “(())abc{]”
(2) “(()))abc{[]}”
(3) “(()()abc{[]}”
(4)“(())abc{[]}”
这两个题目其实不算太难,利用书上的栈的应用就可以做出来
第一题:
scale.h
#include <stdio.h>
#define MaxStackSize 100
typedef char ElemType;
typedef struct {
ElemType stack[MaxStackSize];
int top;
}SequenceStack;
void StackInitiate(SequenceStack *S)
{
S->top = 0; //定义初始栈顶的下标值
}
int StackNotEmpty(SequenceStack S) //判断该栈是否为空
{
if(S.top <= 0)
return 0;
else
return 1;
}
int StackPush(SequenceStack *S,ElemType x) //入栈
{
if(S->top >= MaxStackSize)
{
printf("堆栈已满无法插入!\n");
return 0;
}
else
{
S->stack[S->top] = x;
S->top++;
return 1;
}
}
int StackPop(SequenceStack *S,ElemType *d) //出栈
{
if(S->top <= 0)
{
printf("堆栈已空无数据元素出栈!\n");
return 0;
}
else
{
S->top--;
*d = S->stack[S->top]; //将栈顶的元素值赋予参数d
return 1;
}
}
void ScaleStackNum(int Num,int ScaleNum,SequenceStack *s) //进制转换
{
int ResultNum = 0;
ElemType Result;
if(Num == 0)
{
StackPush(s,Num);
}
while(Num)
{
ResultNum = Num % ScaleNum;
if(ResultNum >= 10) //大于10进制转换
{
ElemType p = ResultNum + 'A' - 10;//转换为对应字符的ASCII值
StackPush(s, p);
}
else //所有进制通用
{
ElemType p = ResultNum + '0';//转换为对应数字字符的ASCII值
StackPush(s, p);
}
Num /= ScaleNum;
}
printf("转换结果:");
while(StackNotEmpty(*s))
{
StackPop(s, &Result);
printf("%c", Result);
}
printf("\n");
}
scale.c
#include <stdio.h>
#include "scale.h"
int main()
{
SequenceStack SC;
StackInitiate(&SC); //堆栈初始化
int ScaleNum = 0;
int Num = 0;
printf("请输入您想转换的进制:");
scanf("%d",&ScaleNum);
printf("\n请输入您想转换的整数:");
scanf("%d",&Num);
ScaleStackNum(Num,ScaleNum,&SC);
return 0;
}
第二题:
Matching.h
#include <stdio.h>
#define MaxStackSize 100
typedef char ElemType;
typedef struct {
ElemType stack[MaxStackSize];
int top;
}SequenceStack;
void StackInitiate(SequenceStack *S)
{
S->top = 0; //定义初始栈顶的下标值
}
int StackNotEmpty(SequenceStack S) //判断该栈是否为空
{
if(S.top <= 0)
return 0;
else
return 1;
}
int StackPush(SequenceStack *S,ElemType x) //入栈
{
if(S->top >= MaxStackSize)
{
printf("堆栈已满无法插入!\n");
return 0;
}
else
{
S->stack[S->top] = x;
S->top++;
return 1;
}
}
int StackPop(SequenceStack *S,ElemType *d) //出栈
{
if(S->top <= 0)
{
printf("堆栈已空无数据元素出栈!\n");
return 0;
}
else
{
S->top--;
*d = S->stack[S->top]; //将栈顶的元素值赋予参数d
return 1;
}
}
int StackTop(SequenceStack S,ElemType *d) //取栈顶元素
{
if(S.top <= 0)
{
printf("堆栈已空!\n");
return 0;
}
else
{
*d = S.stack[S.top - 1];
return 1;
}
}
Matching.c
#include <stdio.h>
#include <stdlib.h>
#include"Matching.h"
int main(){
SequenceStack s,*sp=&s;
char str[200];
int i;
char c,d,*cp=&c,*dp=&d;
int flag = 0;
StackInitiate(sp); //初始化栈
printf("请输入要匹配的例子:");
scanf("%s",str);
if(str[0]==']'|| str[0]==')' || str[0] == '}'){
printf("匹配结果:括号不匹配\n");
exit(1);
}
for(i = 0,c = str[0];c!='\0';i++){
c = str[i];
if(StackNotEmpty(*sp)){
StackTop(s,&d);
}
char t,*tp=&t;
switch(c)
{
case '[':StackPush(sp,c);break;
case '(':StackPush(sp,c);break;
case '{':StackPush(sp,c);break;
case ')':
if(!StackNotEmpty(*sp))
{
flag = 1;
break;
}
else{
if(d == '(')
{
StackPop(sp,tp);
}
else{StackPush(sp,c);}
}
break;
case ']':if(!StackNotEmpty(*sp))
{
flag = 1;
break;
}
else{
if(d == '[')
{
StackPop(sp,tp);
}
else{StackPush(sp,c);}
}
break;
case '}':if(!StackNotEmpty(*sp))
{
flag = 1;
break;
}
else{
if(d == '{')
{
StackPop(sp,tp);
}
else{StackPush(sp,c);}
}
break;
default:break;
}
}
printf("\n匹配结果:");
if(!StackNotEmpty(*sp) && flag == 0){
printf("括号匹配\n");
}
else{
printf("括号不匹配\n");
}
return 0;
}