蓝月心语 2016-10-24 05:07 采纳率: 62.5%
浏览 2109
已采纳

sizeof算出的数组大小怎么不对呢?

在调用match和chang函数的时候sizeof(str)-1为3这是为什么?

 #include<iostream>
using namespace std;
#define ok 1
#define no 0
#define error 0
#define yes 1
#define maxsize 50
struct sqstack//定义一个顺序栈
{
    char data[maxsize];
    int top, bottom;
};
struct sqqueue//定义一个顺序队列
{
    char data[maxsize];
    int front, rear;
};
int initstack(sqstack &s)//初试化栈
{
    s.bottom = s.top = -1;
    return ok;
}
int initqueue(sqqueue &q)//初始化队列
{
    q.front = q.rear = 0;
    return ok;
}
int stack_isempty(sqstack s)//判栈空
{
    if (s.bottom == s.top)
        return yes;
    else
        return no;
}
int queue_isempty(sqqueue q)//判队空
{
    if (q.front == q.rear)
        return yes;
    else
        return no;
}
int stack_isfull(sqstack s)//判栈满
{
    if (s.top-s.bottom>=maxsize)
        return yes;
    else
        return no;
}
int queue_isfull(sqqueue q)//判队满
{
    if ((q.rear+1)%maxsize==q.front)
        return yes;
    else
        return no;
}
int push(sqstack &s, char x)//入栈
{
    if (stack_isfull(s))
        return error;
    else
    {
        s.data[++s.top] = x;
        return ok;
    }
}
int pop(sqstack &s, char &x)//出栈
{
    if (stack_isempty(s))
        return error;
    else
    {
        x = s.data[s.top--];
        return ok;
    }
}
int gettop(sqstack s, char &x)//取栈顶元素
{
    if (stack_isempty(s))
        return error;
    else
    {
        x = s.data[s.top];
        return ok;
    }
}
int enqueue(sqqueue &q, char x)//进队
{
    if (queue_isfull(q))
        return error;
    else
    {
        q.data[q.rear] = x;
        q.rear = (q.rear + 1) % maxsize;
            return ok;
    }
}
int dequeue(sqqueue &q, char &x)//出队
{
    if (queue_isempty(q))
        return error;
    else
    {
        x=q.data[q.front];
        q.front = (q.front + 1) % maxsize;
        return ok;
    }
}
int priority(char x)//判断优先级
{
    int n=0;
    switch (x)
    {
    case '+':n = 3; break;
    case '-':n = 3; break;
    case '*':n = 5; break;
    case '/':n = 5; break;
    case '(':n = 1; break;
    case ')':n = 6; break;
    default: break;
    }
    return n;
}
/*括号匹配思想
从左到右依次扫描每个元素
(1)如果是左括号,直接入栈;
(2)如果是右括号,则出栈,若出栈的是左括号;则该右括号匹配成功;否则括号匹配失败;
(3)扫描完成后若栈空,匹配成功;否则匹配失败;
*/
int match(char str[])
{
    int i; int n = sizeof(str)-1; char x;
    sqstack s; initstack(s);
    for (i = 0; i < n; i++)
    {
        switch (str[i])
        {
        case '(':push(s, str[i]); break;
        case ')':pop(s, x); if (x = '(') break; else return error;
        default:break;
        }
    }
    if (stack_isempty(s))
        return ok;
    else
        return error;

}
/*中缀转后缀表达式:
 从左到右依次扫描每个元素
(1)如果是左括号,直接入栈;
(2)如果是右括号,则将栈中左括号以及之上的元素依次出栈,如果出栈的元素不是左括号,则加入后缀表达式中(这里用队列来存储,也可以直接输出);
(3)如果是其他运算符,如果该操作符优先级比栈顶元素高则直接入栈;否则,依次出栈,加入后缀表达式中,直到如果该操作符优先级比栈顶元素高或者栈空为止;将该元素入栈,(设左括号优先级小于任何操作符);
(4)如果是操作数直接加入后缀表达式(这里用队列来存储,也可以直接输出)*/
int chang(char str[])
{
    int i; char x; int n = sizeof(str)-1;
    sqstack s; initstack(s);
    sqqueue q; initqueue(q);
    for (i = 0; i < n; i++)//从左到右依次扫描
    {
        if (str[i] == '(')//如果是左括号直接入栈,然后扫描下一个元素
            if (push(s, str[i]))
                continue;
            else
                return error;
        else if (str[i] == ')')//如果是右括号,则将左括号之上的元素出栈,依次入队,然后将括号出栈
        {
            while (!stack_isempty(s))
            {
                pop(s, x);
                if (x != '(')
                    enqueue(q, x);
                else
                    break;
            }
            continue;
        }
        else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')//如果是四则运算的符号
        {
            if (gettop(s, x))//如果栈不为空,取出栈顶元素
                if (priority(str[i]) > priority(x))//如果当然元素优先级别大于栈顶元素的优先级别,则入栈
                {
                    if (push(s, str[i]))
                        continue;
                }
                else
                {
                    while (!stack_isempty(s) && priority(str[i]) <= priority(s.data[s.top]))//否则将优先级高于或等于当前运算符的栈顶元素依次出栈并入队,直到栈顶元素优先级比自己低或者遇到左括号为止
                    {
                        pop(s, x);
                        enqueue(q, x);
                    }                           
                    push(s, str[i]);    
                    continue;

                }
            else//如果栈空,则直接入栈
            {
                push(s, str[i]);
                continue;
            }
        }
        else//如果是操作数则直接进队
        {
            enqueue(q, str[i]);
                continue;
        }
    }
    while (!stack_isempty(s))//扫描完成后将栈中剩余的操作符依次入队
    {
        pop(s, x);
        enqueue(q, x);
    }
    while (!queue_isempty(q))//输出后缀表达式
    {
        dequeue(q, x);
        cout << x;
    } 
    return ok;
}void main()
{
    char str[] = "a+b-a*((c+d)/e-f)+g";
    if (match(str))
        chang(str);
    else
        cout << "表达式括号不匹配,请重新输入";
}


  • 写回答

1条回答 默认 最新

  • 小灸舞 2016-10-24 05:39
    关注

    数组传参会退化成指针,在32位机上你sizeof(str)恒为4
    具体参考:http://blog.csdn.net/foreverhuylee/article/details/38333101

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题