*入栈,然后出栈 +入栈,/入栈,然后分别出栈POPPOO
6-4 十进制转换二进制 (15分)
本题要求实现一个函数,将正整数n转换为二进制后输出。
函数接口定义:
void dectobin( int n );
函数dectobin应在一行中打印出二进制的n。建议用递归实现。
裁判测试程序样例:
#include <stdio.h>
void dectobin( int n );
int main()
{
int n;
scanf("%d", &n);
dectobin(n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
10
输出样例:
1010
//思路:先递归,后输出,即可完成逆序
//注意:将递归函数放在输出之前
void dectobin( int n )
{
int a=n%2;
if(n/2!=0)
{
dectobin(n/2);
printf("%d",a);
}
else
{
printf("%d",a);
return;
}
}
7-3 求前缀表达式的值 (25分)
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4
的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4
。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+
、-
、*
、/
以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
答案
//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define N 30
typedef float Status;
typedef float SElemType; //栈元素类型
typedef struct {
SElemType *top;
SElemType *base;
int stacksize;
} SqStack;
Status InitStack(SqStack &S)
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//构造失败
S.top=S.base;//空栈
S.stacksize=STACK_INIT_SIZE;
return OK;
}
//入栈
Status Push(SqStack &S,SElemType e)
//插入e为栈顶元素
{
if(S.top-S.base==S.stacksize)//栈满重新开辟空间
{
S.base=(SElemType*)realloc(S.base,(STACKINCREMENT+S.stacksize)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=(S.base+S.stacksize);
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top=e;
S.top++;
return OK;
}
Status GetTop(SqStack S,SElemType &e)//返回头顶指针
{
if(S.top==S.base)
return ERROR;
else
return e=*(S.top-1);
}
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
else
return e=*--S.top;
}
//判栈空
Status StackEmpty(SqStack &S)
{
if(S.top==S.base)//空栈
{
return TRUE;
}
else return FALSE;
}
//求栈长
int StackLength (SqStack S)
{
int i=0;
SElemType *p;
p=S.top;
while(p!=S.base)
{
p--;i++;
}
return i;
}
int operate(char a) //判断操作符
{
if(a=='+'||a=='-'||a=='*'||a=='/')//测试点0
return 1;
return 0;
}
int main()
{
string str;
int len,i,flag=0,k=1,flagg=0;
double s=0;
getline(cin,str);
len=str.length();
SqStack S;
InitStack(S);
SElemType e;
for(i=len-1; i>=0; i--) //从后往前
{
if(str[i]==' ')
{
if(s!=0)
Push(S,s);
flag=0,s=0,k=1;
}
else if(flag==0&&str[i]>='0'&&str[i]<='9')
flag=1,s=str[i]-'0',k=k*10;
else if(flag==1&&str[i]>='0'&&str[i]<='9')
s=s+(str[i]-'0')*k,k=k*10;//测试点1
else if(flag==1&&str[i]=='-')
s=-s;
else if(flag==1&&str[i]=='.')
s=s/100.0,k=1;
else if(flag==0&&operate(str[i]))
{
double a,b,ans;
a=GetTop(S,e);
Pop(S,e);
b=GetTop(S,e);
Pop(S,e);
if(str[i]=='+')
ans=a+b;
else if(str[i]=='-')
ans=a-b;
else if(str[i]=='*')
ans=a*b;
else if(str[i]=='/')
{
if(b==0)//除数为0则是ERROR
flagg=1;
ans=a/b;
}
Push(S,ans);
}
}
if(StackEmpty(S)) //测试点3
Push(S,s);
if(flagg==1|| StackLength(S)>1)//测试点2
printf("ERROR\n");
else
{
double sum=(float)GetTop(S,e);
printf("%.1lf\n",sum);
}
return 0;
}