第一关:
本关任务:实现栈基本操作,并使用栈基本操作实现十进制数到二进制数的转换。
编程要求
在右侧编辑器补充代码,完成十进制转二进制的转换。
测试说明
平台会对你编写的代码进行测试:
测试输入: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;
}
第二关
任务描述
本关任务:编写一个能将中缀表达式转换为后缀表达式的程序。
相关知识
为了完成本关任务,你需要掌握:
- 中缀表达式转换为后缀表达式的基本原理
- 如何利用栈实现中缀表达式到后缀表达式的转换。
中缀表达式与后缀表达式
中缀表达式:所有运算符出现在它的两个运算分量之间,如:
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;
}