题目:
思路:
此题题目表述很不清晰,并且测试用例给得太少了,非常不好去寻找思路,做起来可能比较让人头疼,下面将思路图解画出来理解一下。
代码:
#include<iostream>
using namespace std;
#include<string.h>
typedef struct Stack
{
char* data;
int top;//记录栈顶位置
int capacity;//记录容量大小
}ST;
void StackInit(ST* ps)//对栈进行初始化
{
ps->data = NULL;
ps->top = 0;
ps->capacity = 0;
}
void StackPush(ST* ps,char x)//入栈
{
if (ps->top == ps->capacity)
{
int newCapacity = ps->capacity = 0 ? 4 : ps->capacity * 2;
char* tmp = (char*)realloc(ps->data, sizeof(char)*newCapacity);
if (tmp == NULL)
{
exit(-1);
}
ps->capacity = newCapacity;
ps->data= tmp;
}
ps->data[ps->top] = x;
ps->top++;
}
bool IsEmpty(ST* ps)//判断栈是否为空
{
return ps->top == 0;
}
void StackPop(ST* ps)//出栈
{
if(!IsEmpty(ps))
ps->top--;
}
char StackTop(ST* ps)//栈顶元素
{
return ps->data[ps->top - 1];
}
bool PriorityJudgment(char top,char x)//操作符优先级判断
{
//用栈顶元素和输入元素做比较
//返回true表明,栈顶元素比进入元素优先级高
if ((top == '*') || (top == '/'))
{
if ((x == '*') || (x == '/') || (x == '+') || (x == '-'))
{
return true;
}
}
else if ((top == '-') || (top == '+'))
{
if ((x == '-') || (x == '+'))
{
return true;
}
else
{
return true;
}
}
}
bool IsOperator(char x)//判断是否是操作符
{
char p[] = "()+-*/";
for (int i = 0; i < 7; i++)
{
if (x == p[i])
return true;
}
return false;
}
void StackCreate(ST* ps,char* arr)
{
int n = 0;
n = strlen(arr);//用n测量字符串有限字符的个数
for (int i = 0; i < n; i++)
{
if (!IsOperator(arr[i]))
{
//如果不是操作符,直接打印
printf("%c", arr[i]);
}
else if(arr[i]=='(')
{
//如果是左括号直接入栈
StackPush(ps, arr[i]);
}
else if(IsEmpty(ps))
{
//如果栈为空直接入栈
StackPush(ps, arr[i]);
}
else if(arr[i]==')')
{
//如果是右括号,那么去通过循环找左括号
while (StackTop(ps) != '(')
{
//每一次将栈顶元素先打印,然后出栈
printf("%c", StackTop(ps));
StackPop(ps);
}
StackPop(ps);//最后把左括号出栈
}
else
{
//是操作符的情况下判断优先级
if (PriorityJudgment(StackTop(ps), arr[i]))
{
//如果栈顶元素优先级大于此元素,即此元素入栈
StackPush(ps, arr[i]);
}
else
{
//如果小于等于此元素,那么先打印栈顶元素,再出栈
printf("%c", StackTop(ps));
StackPop(ps);
}
}
}
}
int main()
{
ST s;
StackInit(&s);
char arr[100];
scanf("%s", arr);
StackCreate(&s,arr);
//最后出来剩下的操作符直至栈为空为止
while(!IsEmpty(&s))
{
printf("%c", StackTop(&s));
StackPop(&s);
}
return 0;
}
此题题目中所 给的一个测试用例其实还存在很多问题没能解决,比如在括号内出现操作符优先级的情况是否判断出栈?但是就以上的思路足以解决此题,过多的情况也就无需考虑太多。