思路:
该题运算符有优先级
堆栈 先转为后缀表达式
注意:
1、程序没有编译或编译不成功,运行的结果只能是上一次成功编译程序的结果(重启软件)
2、c语言没有string和bool类型,要通过引用头文件等方式,间接使用
3、由于可以无限读取,所以在2011年12月,ANSI 采纳了 ISO/IEC 9899:2011 标准,标准中删除了 gets()函数,使用一个新的更安全的函数gets_s()替代(具体用法看下面示例)。
具体用法:
#include <stdio.h> //这个头文件包含gets()函数,这个函数在ISO/IEC 9899 2011(C11)标准中被移除
int main(void)
{
char str1[5]; //不要char*p,然后gets(p),这是错误的,因为p没有指向有效的内存,它可能指向任何非法地址 // 地方的未知大小的内存块,这样以来,就可能修改了不属于本程序的内存的内容
gets(str1);
printf("%s\n", str1);
return 0;
}
#include <stdio.h>//gets_s()用法
#define CH 20
int main(void)
{
char ch[CH];
printf("请输入你的名字:\n");
//gets_s用法:gets_s(buffer,size);
//推荐用字符数组长度-1作为size(留空'\0')
gets_s(ch,CH-1);
printf("这是你的名字:%s\n", ch);
return 0;
}
4、有些OJ编译器gets_s()也不能用,应使用fgets()或getline()
https://blog.csdn.net/CrazyOnes/article/details/81562139
char * fgets ( char * str, int num, FILE * stream );
5、输入时要用英文括号,中文括号占两个字符位
中缀表达式转后缀表达式:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 20
typedef struct st2 {
int top;
char str[maxsize];
}CharStackSize, *CharStack;
//初始化
void init(CharStack cstack)
{
cstack->top = -1;
return;
}
//判空
int CharisEmpty(CharStack cstack)
{
if (cstack->top == -1) {
return 1;
}
return 0;
}
//判满
int CharisFull(CharStack cstack)
{
if (cstack->top == maxsize - 1) {
return 1;
}
return 0;
}
//出栈
int CharPop(CharStack cstack, char * ch)
{
if (CharisEmpty(cstack)) {
return 0;
}
*ch = cstack->str[cstack->top--];
return 1;
}
//进栈
int CharPush(CharStack cstack, char ch)
{
if (CharisFull(cstack)) {
return 0;
}
cstack->str[++cstack->top] = ch;
return 1;
}
int choose(char ch)
{
if (ch == '+' || ch == '-') {
return 1;
}
else if (ch == '*' || ch == '/') {
return 2;
}
else if(ch == ')'){
return 3;
}
else if (ch == '(') {
return 0;
}
else {
return 0;
}
}
int main(int argc, char *argv[])
{
int i;
CharStack cstack = (CharStack)malloc(sizeof(CharStack));
init(cstack);
char biaodashi[50];
scanf("%s",biaodashi);
printf("原表达式:%s\n 长度:%d\n",biaodashi,strlen(biaodashi));
for (i = 0; i < strlen(biaodashi); i++) {
if ('0' <= biaodashi[i] && biaodashi[i] <= '9') {
printf("%c", biaodashi[i]);
}
//处理括号
else if(biaodashi[i] == '(' ) {
CharPush(cstack, biaodashi[i]);
}
else if (biaodashi[i] == ')') {
CharPush(cstack, biaodashi[i]);
while (cstack->top != -1) {
char ch;
CharPop(cstack, &ch);
if(ch != '(' && ch != ')')
printf("%c", ch);
if (ch == '(') {
break;
}
}
}
else {
if (choose(biaodashi[i]) <= choose(cstack->str[cstack->top])) {
while (cstack->top != -1) {
char ch;
CharPop(cstack, &ch);
if (ch != '(' && ch != ')')
printf("%c", ch);
if (ch == '(') {
break;
}
//9+(3-1)*3+6/2
}
CharPush(cstack, biaodashi[i]);
//printf("%c", biaodashi[i]);
}
else {
CharPush(cstack, biaodashi[i]);
}
}
}
while (cstack->top != -1) {
char ch;
CharPop(cstack, &ch);
printf("%c", ch);
}
return 0;
}
中缀转后缀+由后缀表达式计算
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 20
typedef struct st2 {
int top;
char str[maxsize];
}CharStackSize, *CharStack;
//初始化
void init(CharStack cstack)
{
cstack->top = -1;
return;
}
//判空
int CharisEmpty(CharStack cstack)
{
if (cstack->top == -1) {
return 1;
}
return 0;
}
//判满
int CharisFull(CharStack cstack)
{
if (cstack->top == maxsize - 1) {
return 1;
}
return 0;
}
//出栈
int CharPop(CharStack cstack, char * ch)
{
if (CharisEmpty(cstack)) {
return 0;
}
*ch = cstack->str[cstack->top--];
return 1;
}
//进栈
int CharPush(CharStack cstack, char ch)
{
if (CharisFull(cstack)) {
return 0;
}
cstack->str[++cstack->top] = ch;
return 1;
}
int choose(char ch)
{
if (ch == '+' || ch == '-') {
return 1;
}
else if (ch == '*' || ch == '/') {
return 2;
}
else if(ch == ')'){
return 3;
}
else if (ch == '(') {
return 0;
}
else {
return 0;
}
}
//用后缀表达式计算
void calculate(CharStack cstack)
{
int i,sum=0,tag=0;
char left,right;
CharStack temp=(CharStack)malloc(sizeof(CharStack));
init(temp);
for(i=0;i<strlen(cstack->str);i++)
{
//printf("jin\n");
if(cstack->str[i]<='9'&&cstack->str[i]>='0'){
CharPush(temp,cstack->str[i]);
//printf("jin1\n");
}
else
{
//printf("jin2\n");
CharPop(temp, &right);
CharPop(temp, &left);
switch(cstack->str[i])
{
case '+':
if(tag==0){
sum=(int)left-'0'+((int)right-'0');
tag=1;
}
else
sum=(int)left+((int)right-'0');
CharPush(temp,sum);
printf("sum=%d\njin3\n",sum);
break;
case '-':
if(tag==0){
sum=(int)left-'0'-((int)right-'0');
tag=1;
}
else
sum=(int)left-((int)right-'0');
CharPush(temp,sum);
break;
case '*':
if(tag==0){
sum=((int)left-'0')*((int)right-'0');
tag=1;
}
else
sum=((int)left)*((int)right-'0');
CharPush(temp,sum);
break;
case '/':
if(tag==0){
sum=((int)left-'0')/((int)right-'0');
tag=1;
}
else
sum=((int)left)/((int)right-'0');
CharPush(temp,sum);
break;
}
}
}
printf("%d",sum);
}
int main(int argc, char *argv[])
{
int i;
CharStack cstack = (CharStack)malloc(sizeof(CharStack));
//开辟一个新空间存储后缀表达式
CharStack cstack2 = (CharStack)malloc(sizeof(CharStack));
init(cstack);
init(cstack2);
char biaodashi[50];
scanf("%s",biaodashi);
printf("原表达式:%s\n 长度:%d\n",biaodashi,strlen(biaodashi));
for (i = 0; i < strlen(biaodashi); i++) {
if ('0' <= biaodashi[i] && biaodashi[i] <= '9') {
printf("%c", biaodashi[i]);
CharPush(cstack2,biaodashi[i]);
}
//处理括号
else if(biaodashi[i] == '(' ) {
CharPush(cstack, biaodashi[i]);
}
else if (biaodashi[i] == ')') {
CharPush(cstack, biaodashi[i]);
while (cstack->top != -1) {
char ch;
CharPop(cstack, &ch);
if(ch != '(' && ch != ')'){
printf("%c", ch);
CharPush(cstack2,ch);
}
if (ch == '(') {
break;
}
}
}
else {
if (choose(biaodashi[i]) <= choose(cstack->str[cstack->top])) {
while (cstack->top != -1) {
char ch;
CharPop(cstack, &ch);
if (ch != '(' && ch != ')'){
printf("%c", ch);
CharPush(cstack2,ch);
}
if (ch == '(') {
break;
}
//9+(3-1)*3+6/2
}
CharPush(cstack, biaodashi[i]);
//printf("%c", biaodashi[i]);
}
else {
CharPush(cstack, biaodashi[i]);
}
}
}
//将堆栈中剩余的元素弹出并打印
while (cstack->top != -1) {
char ch;
CharPop(cstack, &ch);
printf("%c", ch);
CharPush(cstack2,ch);
}
printf("\n%s\n目前cstack2的长度是:%d\n",cstack2->str,strlen(cstack2->str));
calculate(cstack2);
return 0;
}
参考后的满分代码
#include <iostream>
#include <stack>
#include <string.h>
using namespace std;
stack<int> num;
stack<char> sign;
int main()
{
int i,j=0,n,a,sum,left,right;
cin>>n;
for(i=0;i<n;i++)
{
char str[7];
j=0;
//将两个堆栈置空
while(!sign.empty())
sign.pop();
while(!num.empty())
num.pop();
cin>>str;
while(j<7)
{
if(str[j]>='1'&&str[j]<='9')
{
num.push(str[j]-'0');
//cout<<num.top()<<" jin0 "<<j<<endl;
}
else
{
if(str[j]=='+')
{
sign.push('+');
num.push(str[j+1]-'0');
++j;
//cout<<num.top()<<" jin1 "<<j<<endl;
}
else if(str[j]=='-')
{
sign.push('+');
a=(str[j+1]-'0')*(-1);
num.push(a);
++j;
//cout<<num.top()<<" jin2 "<<j<<endl;
}
else if(str[j]=='x')
{
a=num.top();
num.pop();
sum=a*(str[j+1]-'0');
num.push(sum);
j++;
//cout<<num.top()<<" jin2 "<<j<<endl;
}
else if(str[j]=='/')
{
a=num.top();
num.pop();
sum=a/(str[j+1]-'0');
num.push(sum);
j++;
//cout<<num.top()<<" jin3 "<<j<<endl;
}
}
++j;
}
while(!sign.empty())
{
left=num.top();
num.pop();
right=num.top();
num.pop();
num.push(left+right);
sign.pop();
}
//cout<<num.top();
if(num.top()==24) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}