gpt4 book ai didi

c - 使用堆栈和 C 进行后缀评估

转载 作者:行者123 更新时间:2023-11-30 14:27:11 25 4
gpt4 key购买 nike

我在这里有一段时间遇到了类似的问题,但我认为问题是错误的。为了提供一些背景知识,我的任务是创建一个 C 程序来解决表单中的后缀表达式

8 7 - 9 * =

我认为我的问题是,我的教授给出了一些不正确的堆栈代码。我这么说是因为我经常遇到堆栈溢出(笑)错误,而且我的堆栈远未满。如果有帮助的话,我正在使用 Visual Studio 2005。这是我的代码:

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

#define STACK_SIZE 20

typedef int Bit;

Bit contents[STACK_SIZE];
int top = 0;

void make_empty(void);
int is_empty(void);
int is_full(void);
void push(Bit i);
int pop(void);
void stack_overflow(void);
void stack_underflow(void);

int main(void) {
Bit bit;
char operation;
int operand;
Bit current;
int result;

while(scanf("%d",&current)!= '=')
{
push(current);
}

scanf("%c", &operation);
while(operation != '=')
{
scanf("%d", &operand);
printf("%d\n",top);
//Pushes any number into the stack
if(operand==1||operand==2||operand==3||operand==4||operand==5||operand==6||operand==7||operand==8||operand==9||operand==0)
{
printf("entered number loop\n");
bit = operand;
if(top==20)
{
stack_overflow();
}
push(&bit);
}

//Performs subtraction operation
else if(operation == '-')
{
printf("entered minus loop\n");
if(top==1)
{
stack_underflow();
}

result = pop() - pop();

bit = result;

if(top==20)
{
stack_overflow();
}

push(&bit);
}

//Performs addition operation
else if(operation == '+')
{
if(top==1)
{
stack_underflow();
}

result = pop() + pop();
bit = result;

if(top==20)
{
stack_overflow();
}

push(&bit);
}

//Performs multiplication operation
else if(operation == '*')
{
if(top==1)
{
stack_underflow();
}

result = pop() * pop();
bit = result;

if(top==20)
{
stack_overflow();
}

push(&bit);
}

//Performs division operation
else if(operation == '/')
{
if(top==1)
{
stack_underflow();
}

result = pop() / pop();
bit = result;

if(top==20)
{
stack_overflow();
}

push(&bit);
}

else if(operation == '=')
{
if(top==0)
{
stack_underflow();
}

printf("%d\n",pop());
break;
}
}
return 0;
}

void make_empty(void) {
top = 0;
}

int is_empty(void) {
return top == 0;
}

int is_full(void) {
return top == STACK_SIZE;
}

void push(Bit i) {
if (is_full())
stack_overflow();
else
contents[top++] = i;
}

int pop(void) {
if (is_empty())
stack_underflow();
else
return contents[top--];
}

void stack_overflow(void) {
printf("Error: stack overflow!\n");
exit(EXIT_FAILURE);
}

void stack_underflow(void) {
printf("Error: stack underflow!\n");
exit(EXIT_FAILURE);
}

现在我意识到我的代码现在有点野蛮,对此我深表歉意。话虽如此,我们将不胜感激任何帮助或意见,并提前感谢大家。

<小时/>

好吧,考虑到所有因素后,我想我已经接近了。所有内容都正确进入堆栈,并且所有内容都被正确读取。然而,我的新实现包括将所有内容都设为字符,然后在需要使用时转换整数。这是我的源代码:

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

#define STACK_SIZE 20

typedef int Bit;

char contents[STACK_SIZE];
int top = 0;

void make_empty(void);
int is_empty(void);
int is_full(void);
void push(char i);
char pop(void);
void stack_overflow(void);
void stack_underflow(void);

int main(void) {
char current = 'a';
char result = 'a';
char operation = 'a';
char char1;
char char2;
int number1;
int number2;

scanf("%c", &current);
//While program successfully scanned a number
while(current != '=')
{

//Performs subtraction operation
if(current == '-')
{
printf("entered if 2\n");
char1 = pop();
number1 = char1 - '0';
printf("%d\n", number1);
char2 = pop();
number2 = char2 - '0';
printf("%d\n", number2);
result = number1 - number2;

push(result);
}

//Performs addition operation
else if(current == '+')
{
printf("entered if 2\n");
char1 = pop();
number1 = char1 - '0';
printf("%d\n", number1);
char2 = pop();
number2 = char2 - '0';
printf("%d\n", number2);
result = number1 + number2;

push(result);
}

//Performs multiplication operation
else if(current == '*')
{
printf("entered if 2\n");
char1 = pop();
number1 = char1 - '0';
printf("%d\n", number1);
char2 = pop();
number2 = char2 - '0';
printf("%d\n", number2);
result = number1 * number2;

push(result);
}

//Performs division operation
else if(current == '/')
{
printf("entered if 2\n");
char1 = pop();
number1 = char1 - '0';
printf("%d\n", number1);
char2 = pop();
number2 = char2 - '0';
printf("%d\n", number2);
result = number1 / number2;

push(result);
}

else
{
push(current);
printf("%c\n", current);
}

scanf(" %c", &current);
}

//Prints result
printf("%c\n",pop());

return 0;
}

void make_empty(void) {
top = 0;
}

int is_empty(void) {
return top == 0;
}

int is_full(void) {
return top == STACK_SIZE;
}

void push(char i) {
if (is_full())
stack_overflow();
else
contents[top++] = i;
}

char pop(void) {
if (is_empty())
stack_underflow();
else
return contents[top--];
}

void stack_overflow(void) {
printf("Error: stack overflow!\n");
exit(EXIT_FAILURE);
}

void stack_underflow(void) {
printf("Error: stack underflow!\n");
exit(EXIT_FAILURE);
}

请记住,我已经玩了很多次了,所以有随机的 printfs 和无用的变量,全部用于调试目的。每当我运行它(例如输入 3 5 + =)时,我得到:

enter image description here

再次,请原谅我的一些困惑的代码,因为我对 C 很陌生,但任何帮助都会很棒!

最佳答案

这是一个无限循环:

while(scanf("%d",&current)!= '=') { push(current); }

scanf 返回成功读取的字段数。在您的情况下,这可以是 0 或 1。您将其与 '=' 进行比较,即 ASCII 61。因此 '"!="始终为 true,并且您永远不会通过此循环。

顺便说一句,如果您查看推送的实现方式,您会发现“堆栈溢出”的检查是使用 is_full() 函数完成的。 is_full() 正在将顶部与 STACK_SIZE 进行比较。您正在比较 top==20。你最好使用 is_full。这是更抽象的,即使有人更改了 STACK_SIZE 也可以工作。您甚至可以省略对 top==20 和 top==0 的检查,因为您唯一要做的就是调用 stack_underflow/stack_overflow,这已经由 pop/push 函数完成了。

关于c - 使用堆栈和 C 进行后缀评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com