C++程序求助 入栈 出栈 出现问题 求大神帮忙给个思路什么的

eastqin 2014-05-27 08:30:09
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib> // for exit()
#include <cctype> // for is...()
using namespace std;

enum TknKind {
Print, Lparen, Rparen, Plus, Minus, Multi, Divi,
Assign, VarName, IntNum, EofTkn, Others
};

struct Token {
TknKind kind;
int intVal;
string text;
Token () { kind = Others; intVal = 0; text="";}
Token (TknKind k, int d=0, string s = "") { kind = k; intVal = d; text = s;}
};

void input();
void statement();
void expression();
void term();
void factor();
Token nextTkn();
int nextCh();
void operate(TknKind op);
void push(int n);
int pop();
void chkTkn(TknKind kd);
void varpush(string text);
string varpop();

#define STK_SIZ 50
int stack[STK_SIZ+1];
string stackkey[STK_SIZ+1];

int stkct;

Token token;
char buf[80], *bufp;
int ch;
int var[80];
string varkey[80];
int errF;
int temp=0;



int main()
{
while (1) {
input();
token = nextTkn();
if (token.kind == EofTkn)
exit(1);

statement();
if (errF)
cout << " --err--\n";
}
return 0;
}

void input()
{
errF = 0; stkct = 0;
cin.getline(buf, 80);
bufp = buf;
ch = nextCh();
}

void statement()
{
int vNbr;
int vaNbr;

switch (token.kind) {
case VarName:
vNbr = ++temp;
vaNbr = token.intVal;
token = nextTkn();
chkTkn(Assign); if (errF) break;
token = nextTkn();
expression();
varkey[vNbr] = varpop();
var[vaNbr] = pop();
break;
case Print:
token = nextTkn();
expression();
chkTkn(EofTkn); if (errF) break;
cout << " " << pop() << endl;
return;
default:
errF = 1;
}
chkTkn(EofTkn);
}

void expression()
{
TknKind op;

term();
while (token.kind==Plus || token.kind==Minus) {
op = token.kind;
token = nextTkn(); term(); operate(op);
}
}

void term()
{
TknKind op;

factor();
while (token.kind==Multi || token.kind==Divi) {
op = token.kind;
token = nextTkn(); factor(); operate(op);
}
}

void factor()
{

switch (token.kind) {
case VarName:
varpush(token.text);
temp++;
break;
case IntNum:
push(token.intVal);
break;
case Lparen:
token = nextTkn();
expression();
chkTkn(Rparen);
break;
default:
errF = 1;
}
token = nextTkn();
}

Token nextTkn()
{
TknKind kd=Others;
int num ;

while (isspace(ch))
{
ch = nextCh();
}

if (isdigit(ch))
{
for (num=0; isdigit(ch); ch=nextCh())
{
num = num*10 + (ch-'0');
}
return Token(IntNum, num);
}

else if (islower(ch))
{
string text;
for (num=0 ; islower(ch)||isupper(ch); ch=nextCh())
{
text += ch;
}
return Token(VarName, num,text);
}

else if (isupper(ch))
{
string text;
for (num=0 ; islower(ch)||isupper(ch); ch=nextCh())
{
text += ch;
}
return Token(VarName, num,text);
}

else
{
switch (ch)
{
case '(': kd = Lparen; break;
case ')': kd = Rparen; break;
case '+': kd = Plus; break;
case '-': kd = Minus; break;
case '*': kd = Multi; break;
case '/': kd = Divi; break;
case '=': kd = Assign; break;
case '?': kd = Print; break;
case '\0': kd = EofTkn; break;
}
ch = nextCh();
return Token(kd);
}
}

int nextCh()
{
if (*bufp == '\0')
return '\0';
else
return *bufp++;
}

void operate(TknKind op)
{
int d2 = pop(), d1 = pop();

if (op==Divi && d2==0)
{
cout << " division by 0\n"; errF = 1;
}
if (errF) return;
switch (op)
{
case Plus: push(d1+d2); break;
case Minus: push(d1-d2); break;
case Multi: push(d1*d2); break;
case Divi: push(d1/d2); break;
}
}

void push(int n)
{
if (errF) return;
if (stkct+1 > STK_SIZ)
{
cout << "stack overflow\n"; exit(1);
}


stack[++stkct] = n;
}


int pop()
{
if (errF) return 1;
if (stkct < 1)
{
cout << "stack underflow\n"; exit(1);
}
return stack[stkct--];
}


void varpush(string text)
{
if (errF) return;
if (temp+1 > STK_SIZ)
{
cout << "stack overflow\n"; exit(1);
}

varkey[++temp] = text;

}
string varpop()
{
if (errF) return "1";
if (temp < 1)
{
cout << "stack underflow\n"; exit(1);
}
return varkey[temp--];
}

void chkTkn(TknKind kd)
{
if (token.kind !=kd)errF=1;
}
...全文
52 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

65,209

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧