永发信息网

在c++利用栈进行表达试的计算

答案:1  悬赏:40  手机版
解决时间 2021-06-03 22:41
  • 提问者网友:疯子也有疯子的情调
  • 2021-06-03 13:04

要求:设置一个算法解决表达试的计算。

内容:

1:构造函数,初始化栈。

2:析够函数,删除栈中的动态空间。

3:检查栈是否为空。

4:读取栈中的元素。

5:向栈中插入元素。

6:从栈中删除元素。

7:检查栈中是否为满。

8:计算后缀表达式的值。

9:进行中缀表达式。

10:转后缀表达式。

最终要求:要求能够运行出结果。最好有结果截图。主函数编写很简明。

最佳答案
  • 五星知识达人网友:酒者煙囻
  • 2021-06-03 13:39

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef enum{
Token_Error = 0,
Token_Int = 'i',
Token_Div = '/',
Token_Mul = '*',
Token_Sub = '-',
Token_Add = '+',
Token_Mod = '%',
Token_Lp = '(',
Token_Rp = ')'
}TokenType;


class Token{
public:
int type;
double value;


Token(){
type = Token_Error;
value = 0;
}
};


class ArrayStack{
private:
char * name;
Token *tokens;
int size;
int capacity;


public:
ArrayStack(char* n){
name = n;
size = 0;
capacity = 256;
tokens = new Token[capacity];
}


~ArrayStack(){
delete[] tokens;
}


int getSize(){
return size;
}


bool isEmpty(){
return (size == 0);
}


bool isFull(){
return (size == capacity);
}


void push(Token token){
if(size < capacity){
tokens[size ++] = token;
}else{
}
}


Token* pop(){
if(size > 0){
size --;
return &tokens[size];
}else{
return NULL;
}
}


Token* peek(){
if(size > 0){
return &tokens[size-1];
}else{
return NULL;
}
}


void toString(){
if(size == 0){
printf("%s[0]=\n", name);
return;
}
printf("%s[%d]=", name, size);
printf("(");
printf("{%c,%.4f}", tokens[0].type, tokens[0].value);
for(int i=1; i<size; i++){
printf(", {%c,%.4f}", tokens[i].type, tokens[i].value);
}
printf(")\n");
}
};



void calculate(ArrayStack &operandStack, ArrayStack &operatorStack){
if(operandStack.getSize() < 2){
return;
}
Token *t1 = operandStack.pop();
Token *t2 = operandStack.peek();
Token *op = operatorStack.pop();
switch(op->type){
case '*':
t2->value *= t1->value;
break;
case '/':
t2->value /= t1->value;
break;
case '+':
t2->value += t1->value;
break;
case '-':
t2->value -= t1->value;
break;
default:
printf("*********Syntax Error!*********\n");
exit(1);
break;
}
}



int main(int argc, char *argv[]){
char buffer[256];
if(argc > 1){
strcpy(buffer, argv[1]);
}else{
printf("Input the statement(1-256 characters):\n");
scanf("%s", buffer);
}


ArrayStack operandStack("operandStack ");
ArrayStack operatorStack("operatorStack");
int streamLen = strlen(buffer);
char c;

for(int index=0; index<streamLen; index++){
c = buffer[index];
Token t;
if(c >= '0' && c <= '9'){
t.type = Token_Int;
t.value = c - '0';
operandStack.push(t);
if(!operatorStack.isEmpty()){
if(operatorStack.peek()->type == '*'
|| operatorStack.peek()->type == '/'){
calculate(operandStack, operatorStack);
}
}
}else{
t.type = c;
Token *temp;
switch(c){
case ')':
if(operatorStack.isEmpty()){
printf("*********Syntax Error!*********\n");
exit(0);
}
temp = operatorStack.peek();
if(temp->type == '('){
// 使(int) ==> int, 即去掉整数两边的括号后再归约.
operatorStack.pop();
calculate(operandStack, operatorStack);
}else{
calculate(operandStack, operatorStack);
operatorStack.pop();
}
break;
case '-':
case '+':
if(!operatorStack.isEmpty()){
temp = operatorStack.peek();
if(temp->type == '+' || temp->type == '-'){
calculate(operandStack, operatorStack);
}
}
operatorStack.push(t);
break;
default:
operatorStack.push(t);
break;
}
}
}
calculate(operandStack, operatorStack);


printf("=%f", operandStack.pop()->value);
printf("\n");
return 0;
}

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯