数据与结构实验二:栈

第一关:

本关任务:实现栈基本操作,并使用栈基本操作实现十进制数到二进制数的转换。

编程要求

在右侧编辑器补充代码,完成十进制转二进制的转换。

测试说明

平台会对你编写的代码进行测试:

测试输入:173 预期输出:10101101

测试输入:5 预期输出:101

#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
typedef struct stack
{    
	int Data[MaxSize];    
	int Top;      
} SeqStack;
SeqStack* creatstack()
{    
	SeqStack *p = (SeqStack*)malloc(sizeof(SeqStack));
    	p->Top = -1;    
    	return p;
}
void Push(SeqStack *p,int x)
{        
	p->Top++;        
	p->Data[p->Top] = x;
}
void convNum(SeqStack *p,int n, int R)
{    
	while (n!=0)    
	{        
		Push(p,n%R);        
		n/=R;    
	}
}
int main()
{    
	SeqStack *s;    
	s = creatstack();    
	int x; 
	int r=2; //要转化的进制数  
	printf("输入的十进制数:");
	scanf("%d", &x);    
	convNum(s,x,r);    
	while (s->Top!=-1)    
	{      
	    
		printf("%d", s->Data[s->Top--]);    
		
	}    
	printf("---得到的二进制数");
	return 0;
}

第二关

任务描述

本关任务:编写一个能将中缀表达式转换为后缀表达式的程序。

相关知识

为了完成本关任务,你需要掌握:

  1. 中缀表达式转换为后缀表达式的基本原理
  2. 如何利用栈实现中缀表达式到后缀表达式的转换。
中缀表达式与后缀表达式

中缀表达式:所有运算符出现在它的两个运算分量之间,如:

31*(5-22)+70

后缀表达式:所有运算符出现在它的两个运算分量后面,如:

31 5 22 - * 70 +

先将#压入栈中,然后上面式子的输出顺序以及栈中变化为

31:输出31,栈中元素为(假设左边为栈底)#

*:*与栈顶元素比较,比栈顶元素优先级大,则*入栈,栈中元素为(假设左边为栈底)#*

(:(入栈,栈中元素为(假设左边为栈底)#*(

5:输出5,栈中元素为(假设左边为栈底)#*(

-:-与栈顶元素比较,比栈顶元素优先级大,则-入栈,栈中元素为(假设左边为栈底)#*(-

22:输出22,栈中元素为(假设左边为栈底)#*(-

):-(依次出栈,仅打印-,栈中元素为(假设左边为栈底)#*

+:+与栈顶元素比较,比栈顶元素优先级小,则一直出栈到+为老大为止,即出栈并打印*,之后+入栈,栈中元素为(假设左边为栈底)#+

70:输出70,栈中元素为(假设左边为栈底)#+

表达式结束,将栈中除#外,全部元素输出,此时输出+

中缀表达式到后缀表达式的转换方法:

初始化一个栈,用于存放运算符,在栈中压人##优先级最低。

从左到右遍历中缀表达式的每个数字和符号,若是数字,则输出,成为后缀表达式的一部分,若是符号:

(1)若是左括号,直接压入栈;

(2)若是右括号,则从符号栈弹栈输出,直至弹出左括号(左右括号不输出)

(3)如果遇到任何其他的操作符,从栈中弹出元素直到遇到更低优先级的元素(或者栈中只有#)为止(注意:这个更低优先级的元素此时不会被出栈,而左括号的优先级低,具体见下方表格)。弹出这些元素后,再将遇到的操作符压入到栈中。

(4)如果我们读到了中缀表达式输入的末尾,则弹出栈中所有元素依次输出。

有一点需要注意,只有在遇到“)”的情况下我们才弹出“(”,其他情况我们都不会弹出” ( “。

编程要求

在右侧编辑器补充代码,将中缀表达式转换为后缀表达式。

测试说明

平台会对你编写的代码进行测试:

测试输入:31*(5-22)+70 预期输出:31 5 22 - * 70 +

测试输入:52+3*21-32/2 预期输出:52 3 21 * + 32 2 /

#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
const int M=1010;
char str[M],st[M],c;
stack<char> q;
int main()
{
    int i,j,k=0,l,m,n,f=0,t=0,ff=0;
    cin.getline(str,110);
    l=strlen(str);
    for(i=0; i<l; i++)
    {
        if(str[i]>='0'&&str[i]<='9')
        {
            t=1;
            if(ff==0)
            {
                printf("%c",str[i]);
                ff=1;
                f=0;
                continue;
            }

            if(f==0)
                printf("%c",str[i]);
            else 
            {
                printf(" %c",str[i]);
                f=0;
            }
        }

        else if(str[i]=='.')
        {
            printf("%c",str[i]);
        }

        else if(i==0&&str[i]=='+')
        {
            printf("%c",str[i]);
        }

        else if(i==0&&str[i]=='-')
        {
            printf("%c",str[i]);
        }

        else if(str[i]=='('&&str[i+1]=='-')
        {

            if(t==1)
                printf(" %c",str[i+1]);
            else
                printf("%c",str[i+1]);
            q.push(str[i]);
            f=0;
            i++;
        }

        else if(str[i]=='('&&str[i+1]=='+')
        {
            
            q.push(str[i]);
            f=1;
            i++;
        }

        else if(str[i]=='(')
        {
            q.push(str[i]);
            f=1;
        }

        else if(str[i]==')')
        {
            
            while(q.top()!='(')
            {
                printf(" %c",q.top());
                f=1;
                q.pop();
            }

            q.pop();
        }
        else
        {

            if(q.size()==0||q.top()=='(')
            {
                f=1;
                q.push(str[i]);
            }

            else if((str[i]=='*'||str[i]=='/')&&(q.top()=='+'||q.top()=='-'))
            {
                f=1;
                q.push(str[i]);
            }


            else
            {

                if(q.top()=='*'||q.top()=='/')
                {
                    f=1;
                    printf(" %c",q.top());
                    q.pop();
                    if(q.size()==0||q.top()=='(')
                    {
                        f=1;
                        q.push(str[i]);
                    }

                    else if(str[i]=='*'||str[i]=='/')
                    {
                        f=1;
                        q.push(str[i]);
                    }

                    else if(str[i]=='+'||str[i]=='-')
                    {
                        f=1;
                        printf(" %c",q.top());
                        q.pop();
                        q.push(str[i]);
                    }
                }

                else if(q.top()=='+'||q.top()=='-')
                {

                    if(str[i]=='*'||str[i]=='/')
                    {
                        f=1;
                        q.push(str[i]);
                    }
                    else if(str[i]=='+'||str[i]=='-')
                    {
                        f=1;
                        printf(" %c",q.top());
                        q.pop();
                        q.push(str[i]);
                    }
                }
            }
        }
    }

    while(q.size()!=0)
    {
        printf(" %c",q.top());
        q.pop();
    }
    printf("\n");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值