数据结构作业8复习

在这里插入图片描述

*入栈,然后出栈 +入栈,/入栈,然后分别出栈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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值