c++-错误 1 error C2872: “less”: 不明确的符号

问题描述

错误 1 error C2872: “less”: 不明确的符号

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "ctype.h"
#include "malloc.h"
#include
using namespace std;

#define N 1000

typedef struct input *Pin;//表达式链结点
struct input
{
int info;//数字用数值存储,符号用对应的ASCII码存储
int type;//标记:0为数字,1为符号
Pin next;
}head;

typedef struct node *pnode;//栈结点
struct node
{
int info; //结点内容
pnode next;
};

struct LinkStack
{
pnode top;
};
typedef struct LinkStack * PLinkStack;

PLinkStack OPTR, OPND;//符号栈、数值栈
Pin E;
Pin now;
char in[N];

int top(PLinkStack plstack);//取栈顶元素
void push(PLinkStack plstack, int n);//入栈
int pop(PLinkStack plstack);//出栈
int signature(int n);//符号处理模块
int transform(int c);//将运算符转换成符号分析表中的坐标
int cmp(int i, int j);//查符号分析表,返回优先级
int less(Pin E);//符号表小于操作
int equal(Pin E);//符号表等于操作
int greater(Pin E);//符号表大于操作
void change();////将输入字符串转化为链表,在输入表达式前后各加一个#
void start();//获得输入字符,检测其合法性
Pin provide();//每次调用时返回一个结点

int main()
{
int flag1 = 1, flag2 = 1, temp, value;
OPND = (struct LinkStack *) malloc(sizeof(struct LinkStack));
OPTR = (struct LinkStack *) malloc(sizeof(struct LinkStack));

while (flag1)//控制可以循环输入表达式
{
    flag2 = 1;
    OPND->top = NULL;
    OPTR->top = NULL;
    push(OPTR, '#');

    start();//获得输入字符,检测其合法性
    printf("后缀表达式:");

    while (flag2 != 0)
    {
        E = provide();//获得一个结点,数字/符号
        if (E->type == 0)//数字处理
        {
            printf("%d ", E->info);//输出后缀式子控制
            push(OPND, E->info);
        }
        else if (E->type == 1)//符号处理
        {
            temp = signature(E->info);
            if (temp == 1)
            {
                value = pop(OPND);//表达式的值
                flag2 = 0;
            }
        }
        else
        {
            printf("无法获得结点信息!n");
        }
    }
    printf("n表达式的值为:%dn", value);
    printf("n");
}

}

void start()//获得输入字符,检测其合法性
{
head.next = NULL;
now = &head;
int i;
int len;
bool pass = true;
int flag = 0;

while (pass)
{
    printf("请输入表达式:");
    scanf_s("%s", in);

    len = strlen(in);

    for (i = 0; i<len; i++)//输入表达式合法检测:只能输入数字、+、-、*、/、(、)。对于")(" "i("v ")i" 格式报错
    {
        if ((in[i] >= '0'&&in[i] <= '9') || (in[i] == '+') || (in[i] == '-') || (in[i] == '*') || (in[i] == '/') || (in[i] == '(') || (in[i] == ')'))
        {
            if (!(in[i] >= '0'&&in[i] <= '9') && !(in[i + 1] >= '0'&&in[i + 1] <= '9'))
            {
                if (!(in[i] == ')' || in[i + 1] == '('))
                {
                    flag = 1;
                    printf("表达式有误!nn");
                }
                if (in[i] == ')'&&in[i + 1] == '(')
                {
                    flag = 1;
                    printf("表达式有误!nn");
                }
            }
            else if ((in[i] >= '0'&&in[i] <= '9'&&in[i + 1] == '(') || (in[i] == ')'&&in[i + 1] >= '0'&&in[i + 1] <= '9'))
            {
                flag = 1;
                printf("表达式有误!nn");
            }
        }
        else
        {
            flag = 1;
            printf("错误:非法字符!nn");
        }
    }
    if (flag == 1)
    {
        flag = 0;
        pass = true;
    }
    else
        pass = false;
}
change();

}

void change()//将输入字符串转化为链表,在输入表达式前后各加一个#
{
int num = 0;
char *p, *q;
p = &in[0];
q = &in[1];

while (*p != '')
{
    if (*p >= '0'&&*p <= '9')
    {
        num = num * 10 + (*p - '0');
        if (!(*q >= '0'&&*q <= '9'))
        {
            Pin temp = (Pin)malloc(sizeof(struct input));
            temp->next = NULL;
            now->next = temp;
            now = temp;
            temp->info = num;
            temp->type = 0;
            num = 0;
        }
    }
    else
    {
        Pin temp = (Pin)malloc(sizeof(struct input));
        temp->next = NULL;
        now->next = temp;
        now = temp;
        temp->info = *p;
        temp->type = 1;
    }
    p++;
    q++;
}
Pin temp = (Pin)malloc(sizeof(struct input));
temp->next = NULL;
temp->info = '#';
temp->type = 1;
now->next = temp;
now = head.next;

}

Pin provide()//每次调用时返回一个结点
{
Pin temp = now;
now = now->next;
return temp;
}

int top(PLinkStack plstack)//取栈顶元素
{
return plstack->top == NULL ? -1 : plstack->top->info;;
}

void push(PLinkStack plstack, int n)//入栈操作
{
pnode tem = (struct node *)malloc(sizeof(struct node));
tem->info = n;
tem->next = NULL;
if (plstack->top == NULL)
{
plstack->top = tem;
return;
}
tem->next = plstack->top;
plstack->top = tem;
return;
}

int pop(PLinkStack plstack)//出栈操作
{
int tem;
if (plstack->top == NULL)
return -1;
tem = plstack->top->info;
plstack->top = plstack->top->next;
return tem;
}

int signature(int n)
{
int i, j, temp;//i前一个符号,j后一个符号
int comp;
if (top(OPTR) == -1) { push(OPTR, n); }//栈为空,直接压入栈
else
{
comp = cmp(top(OPTR), n);//比较运算符优先级
}
switch (comp)
{
case -1:temp = less(E); break;
case 0:temp = equal(E); break;
case 1:temp = greater(E); break;
}
if (n == 35 && top(OPTR) != 35)//!!!当前符号为表达式末尾的#,若符号栈内有未计算的符号,递归调用符号处理
{
temp = signature(n);
}
return temp;
}

int less(Pin E)//当前符号进栈OPTR
{
push(OPTR, E->info);
return 0;
}

int equal(Pin E)
{
int z;
if (E->info == 35) return 1;//当前符号为表达式末尾的#
else
{
z = pop(OPTR);
return 0;
}
}

int greater(Pin E)//基于当前符号的计算
{
int a, b, t, r, flag = 1, Z;
b = pop(OPND);
a = pop(OPND);
t = pop(OPTR);
printf("%c ", t);
switch (t)
{
case 43:r = a + b; break;//'+'
case 45:r = a - b; break;//'-'
case 42:r = a*b; break;//'*'
case 47:r = a / b; break;//'/'
}
if (E->info == ')') //运算结束后将'('出栈
pop(OPTR);
else
{
if (E->info != '#')
push(OPTR, E->info);
}
push(OPND, r);

return E->info == 35 ? 1 : 0;//是#,分析结束,输出结果;不是#,继续取E

}

int cmp(int i, int j)//查表并返回表中优先级,<为-1,=为0,>为1,-2为出错
{
int first, second;
int Table[7][7] = { { 1, 1, -1, -1, -1, 1, 1 }, { 1, 1, -1, -1, -1, 1, 1 }, { 1, 1, 1, 1, -1, 1, 1 }, { 1, 1, 1, 1, -1, 1, 1 }, { -1, -1, -1, -1, -1, 0, -2 }, { 1, 1, 1, 1, -2, 1, 1 }, { -1, -1, -1, -1, -1, -2, 0 } };
return Table[transform(i)][transform(j)];
}

int transform(int ch)//将符号转换为分析表中的坐标
{
int num;
switch (ch)
{
case 43:
num = 0; break;
case 45:
num = 1; break;
case 42:
num = 2; break;
case 47:
num = 3; break;
case 40:
num = 4; break;
case 41:
num = 5; break;
case 35:
num = 6; break;
default:
printf("符号%c错误!", ch);
}
return num;
}

时间: 2024-09-20 05:56:57

c++-错误 1 error C2872: “less”: 不明确的符号的相关文章

c++的问题-error C2872: “IXMLDOMNodePtr”: 不明确的符号

问题描述 error C2872: "IXMLDOMNodePtr": 不明确的符号 #if !defined(AFX_STDAFX_H__C555D046_EEF7_419A_AC15_0A769717646A__INCLUDED_) #define AFX_STDAFX_H__C555D046_EEF7_419A_AC15_0A769717646A__INCLUDED_ #if _MSC_VER > 1000#pragma once#endif // _MSC_VER >

数据结构 迷宫问题-错误 27 error C2449: 在文件范围内找到“{”(是否缺少函数头?)

问题描述 错误 27 error C2449: 在文件范围内找到"{"(是否缺少函数头?) #include#include #define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREAMENT 10 //存储空间分配增量#define num 10 typedef int MazeType[num][num];int curstep; //定前当前足迹MazeType m = {0000000000 typedef struct

c++-C++ 链接错误 fatal error LNK1104: 无法打开文件“mapnik.lib”

问题描述 C++ 链接错误 fatal error LNK1104: 无法打开文件"mapnik.lib" 我在mapnik项目中Debug模式下编译成功.lib文件,然后再另一个Debug项目中链接mapnik.lib,就出现了LNK1104, 而在Release状态下是成功的,(debug下的mapnik.lib文件有3个多G),试了半天了,还是一头雾水 解决方案 错误分析:LNK 1104是链接的错误,在链接一些lib或者exe文件时,如果链接路径错误或者无法打开其文件时,就会出

c++组建错误fatal error LNK1120: 1 unresolved externals

问题描述 c++组建错误fatal error LNK1120: 1 unresolved externals 解决方案 你的构造函数vsctor只有声明没有实现,operator+也是 main前面少了void或者int 解决方案二: http://zhidao.baidu.com/link?url=opLbcZL9X9-z6HPCTvzADhflalNetCedyWJc_X4webib9gjQPQypr-1TPlTecCPKlbmVyesEHthp0-SbX661zq 解决方案三: http

ThinkPHP提示错误Fatal error: Allowed memory size的解决方法_php实例

本文实例讲述了ThinkPHP提示错误Fatal error: Allowed memory size的解决方法.分享给大家供大家参考.具体分析如下: 如果你的ThinkPHP提示你:致命错误(Fatal error: Allowed memory size),根据网上说的提高服务器可使用内存,我觉得都不是好的解决办法.麻烦也没必要.因为这是ThinkPHP本身存在BUG. 错误提示:Fatal error: Allowed memory size of 1073741824 bytes exh

IIS中应用程序中的服务器错误HTTP Error 404.3-Not Found

应用程序中的服务器错误 HTTP http://www.aliyun.com/zixun/aggregation/16539.html">Error 404.3 - Not Found 描述: 由于 Web 服务器上配置的多用途 Internet 邮件扩展(Multipurpose Internet Mail Extensions, MIME)映射策略的原因,无法处理所请求的页面.您请求的页面具有无法识别的文件扩展名,因而不被允许. 错误代码: 0x80070032 最可能的原因: 可能是

升级mysql_upgrade 提示错误FATAL ERROR: Upgrade failed的原因

升级mysql_upgrade 提示错误FATAL ERROR: Upgrade failed的原因 2014年07月25日 10:33 by:老修--走失的镜头盖分类:网站技术 -> mysql 正文我来说两句 用mysql_upgrade 升级mysql的两种错误: 第一种. 提示FATAL ERROR:Upgrade failed 的时候时候输入mysql升级命令并输入密码后出现下面的错误提示: [root@AY1405111111157597d01Z ~]# mysql_upgrade

ios8定位提示错误kCLErrorDomain error 8

问题描述 ios8定位提示错误kCLErrorDomain error 8 ios8定位提示错误kCLErrorDomain error 8 请问怎么解决 解决方案 http://stackoverflow.com/questions/21624712/clgeocoder-returning-error-the-operation-couldn-t-be-completed-kclerrordomai

代码-关于在VS2008中的错误:error C2660: “cvCreateImage”: 函数不接受 1 个参数

问题描述 关于在VS2008中的错误:error C2660: "cvCreateImage": 函数不接受 1 个参数 代码如下,很急,谢各位#include ""stdafx.h""#include ""stdio.h"" #include ""cv.h""#include ""cxcore.h""#include &quo