输入一个值后报错显示位置冲突,我想了想可能是字符数组那里出现了问题,但不知道怎么解决。小伙伴们帮忙看看!!
#include
#include
#include
#define MAX_SIZE 1000
typedef struct my_stack {
int* base; //指向栈底
int* top;//指向栈顶
int stacksize;
}Stack;
void init(Stack& st) /// 初始化栈st
{
st.base = (int*)malloc(sizeof(int) * MAX_SIZE);
if (!st.base) {
exit(0);
}
st.top = st.base;
st.stacksize = MAX_SIZE;
}
bool full(Stack& st) /// 判断是否栈满
{
if (st.top-st.base>=st.stacksize) {
return 1;
}
else {
return 0;
}
}
bool empty(Stack& st) /// 判断是否栈空
{
if (st.base == st.top) {
return 1;
}
else {
return 0;
}
}
void push(Stack& st, int e) /// e进栈
{
*st.top = e;
st.top++;
}
int pop(Stack& st, int& e) /// 出栈,由参数e带回
{
st.top--;
return *st.top;
}
int main()
{
Stack s;
init(s);
char str[MAX_SIZE];
int d, e;
scanf_s("%s", str);
while (strcmp(str,"=")!=0)
{
if (strcmp(str, "/") == 0) {
pop(s, e);
pop(s, d);
push(s, e / d);
}
else if (strcmp(str, "%") == 0) {
pop(s, e);
pop(s, d);
push(s, e %d);
}
else if (strcmp(str, "+") == 0) {
pop(s, e);
printf("%d\n", e);
pop(s, d);
printf("%d\n", d);
push(s, e + d);
}
else if (strcmp(str, "-") == 0)
{
pop(s, e);
pop(s, d);
push(s, e - d);
}
else if (strcmp(str, "*") == 0) {
pop(s, e);
pop(s, d);
push(s, e * d);
}
else {
int a = atoi(str);
push(s, a);
printf("%d\n", a);
}
scanf_s("%s", str);
}
pop(s, d);
printf("%d", *s.top);
return 0;
}
class Operator {
Character sign;
Integer level;
Operator(Character sign, Integer level) {
this.sign = sign;
this.level = level;
}
public static boolean isOperator(String str) {
if (str == null || str.length() == 0) {
return false;
}
return "+".equals(str) || "-".equals(str) || "*".equals(str) || "/".equals(str);
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Arrays.toString(infixExprStrToPostfixExprList("1+(2+4)*5+8/2").toArray()));
System.out.println(getPostfixExprVal(infixExprStrToPostfixExprList("1+(2+4)*5+8/2")));
}
/**
* 中缀表达式串 -> 后缀表达式集合
*
* @param infixExprStr 中缀表达式串
* @return 后缀表达式集合
*/
private static List<String> infixExprStrToPostfixExprList(String infixExprStr) {
char[] infixExprCharArr = infixExprStr.toCharArray();
Stack<Operator> signStack = new Stack<>();
StringBuffer numberBuffer = new StringBuffer();
List<String> postfixExprList = new ArrayList<>(20);
for (int index = 0; index < infixExprCharArr.length; index++) {
char ch = infixExprCharArr[index];
boolean isOperator = ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')';
if (!isOperator) {
numberBuffer.append(ch);
continue;
}
if (numberBuffer.length() != 0) {
postfixExprList.add(numberBuffer.toString());
numberBuffer.setLength(0);
}
switch (ch) {
case '+':
while (!signStack.isEmpty() && signStack.peek().level >= 1) {
postfixExprList.add(signStack.pop().sign.toString());
}
signStack.add(new Operator('+', 1));
break;
case '-':
while (!signStack.isEmpty() && signStack.peek().level >= 1) {
postfixExprList.add(signStack.pop().sign.toString());
}
signStack.add(new Operator('-', 1));
break;
case '*':
while (!signStack.isEmpty() && signStack.peek().level >= 2) {
postfixExprList.add(signStack.pop().sign.toString());
}
signStack.add(new Operator('*', 2));
break;
case '/':
while (!signStack.isEmpty() && signStack.peek().level >= 2) {
postfixExprList.add(signStack.pop().sign.toString());
}
signStack.add(new Operator('/', 2));
break;
case '(':
signStack.add(new Operator('(', 0));
break;
case ')':
while (!signStack.isEmpty() && signStack.peek().level != 0) {
postfixExprList.add(signStack.pop().sign.toString());
}
if (!signStack.isEmpty() && signStack.peek().level == 0) {
signStack.pop();
}
break;
default:
}
}
if (numberBuffer.length() != 0) {
postfixExprList.add(numberBuffer.toString());
}
while (!signStack.isEmpty()) {
postfixExprList.add(signStack.pop().sign.toString());
}
return postfixExprList;
}
/**
* 获取后缀表达式的值
* @param postfixExprList 后缀表达式集合
* @return 最终的计算值
*/
private static BigDecimal getPostfixExprVal(List<String> postfixExprList) {
Stack<String> calculateStack = new Stack<>();
for (String content : postfixExprList) {
if (Operator.isOperator(content)) {
String number2 = calculateStack.pop();
String number1 = calculateStack.pop();
String result = "";
switch (content) {
case "+":
result = strToNumber(number1).add(strToNumber(number2)).toString();
break;
case "-":
result = strToNumber(number1).subtract(strToNumber(number2)).toString();
break;
case "*":
result = strToNumber(number1).multiply(strToNumber(number2)).toString();
break;
case "/":
result = strToNumber(number1).divide(strToNumber(number2), 10, BigDecimal.ROUND_HALF_UP).toString();
break;
default:
}
calculateStack.push(result);
} else {
calculateStack.push(content);
}
}
return strToNumber(calculateStack.pop());
}
/**
* 数字串转数字
*
* @param numberStr 数字串
* @return BigDecimal 类型数字
*/
private static BigDecimal strToNumber(String numberStr) {
return new BigDecimal(numberStr);
}
}