- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在大学做练习,这里是:“输入等式,检查是否有括号。如果它是开放的 - 压入堆栈。如果它是关闭的 - 检查堆栈的头元素是左括号/圆括号。如果堆栈为空,则等式是正确的”。我编写了代码以在 main() 函数中检查它。但需要在第一个函数中检查方程的元素是否为括号/括号,并与下一个括号/括号进行比较。
如果你能帮助我,非常感谢)。代码如下:
#include <stdio.h> <stdlib.h> <string.h>
#define STACK_SIZE 20
#define OVERFLOW -100
#define UNDERFLOW -101
///BEGIN DEFINING
typedef char C;
typedef struct Stack_tag {
C data[STACK_SIZE];
size_t size;
} Stack;
///END DEFINING
///BEGIN STACK FUNCTIONS
void Push(Stack* stack, const C value) {
if (stack->size >= STACK_SIZE) exit(OVERFLOW);
stack->data[stack->size] = value;
stack->size++;
}
C Pop(Stack* stack) {
if (stack->size == 0) exit(UNDERFLOW);
stack->size--;
return stack->data[stack->size];
}
C Peek(const Stack* stack) {
if (stack->size <= 0) exit(UNDERFLOW);
return stack->data[stack->size - 1];
}
void PrintStackValue(const C value) {
printf("%c", value);
}
void PrintStack(const Stack* stack, void(*PrintStackValue)(const C)) {
int i, len = stack->size - 1;
printf("\nStack %d", stack->size);
for (i = 0; i < len; i++) {
PrintStackValue(stack->data[i]);
printf(" | ");
}
if (stack->size != 0) {
PrintStackValue(stack->data[i]);
}
printf("\n");
}
///END STACK FUNCTIONS
///BEGIN OTHER FUNCTIONS
char isBr(char item) {
switch (item) {
case '(': return '(';
case ')': return ')';
case '[': return '[';
case ']': return ']';
case '{': return '{';
case '}': return '}';
default: return NULL;
}
}
void Check(char item, Stack stack) {
switch (item) {
case '(': Push(&stack, item);
case '[': Push(&stack, item);
case '{': Push(&stack, item);
case ')': if (Peek(&stack) == '(') Pop(&stack);
case ']': if (Peek(&stack) == ']') Pop(&stack);
case '}': if (Peek(&stack) == '}') Pop(&stack);
}
}
///END OTHER FUNCTIONS
int main()
{
Stack stack;
stack.size = 0;
///EQUATION
char* equation;
int i;
equation = (char*)malloc(100 * sizeof(char));
printf("Enter the Equation: \n");
gets(equation);
///CHECKING PROCESS
///TODO:
///1) SEPARATE FUNCTIONS
for (i = 0; i < strlen(equation); i++) {
/*
if (equation[i] == '(' || equation[i] == '{' || equation[i] == '[') {
Push(&stack, equation[i]);
}
if (equation[i] == ')') {
if (Peek(&stack) == '(') Pop(&stack);
}
if (equation[i] == '}') {
if (Peek(&stack) == '{') Pop(&stack);
}
if (equation[i] == ']') {
if (Peek(&stack) == '[') Pop(&stack);
}
*/
char p = isBr(equation[i]);
Check(p, stack);
}
///PRINT THE RESULT
puts(stack.size == 0 ? "FINE" : "NOOPE!!!");
//PrintStack(&stack, PrintStackValue);
return 0;
}
最佳答案
这里有两个问题:
当您将堆栈结构传递给Check
时,函数会看到堆栈的副本。因此,您所做的更改在 main
中丢失了——它们只对副本进行了。传递一个指向该结构的指针,就像您为堆栈操作的函数所做的那样。 (由于变量 stack
将成为 Check
中的指针,因此您应该将 stack
而不是 &stack
传递给堆栈函数。)
C 中的 switch
语句中的情况不是孤立的。如果您不以 break
或 return
结束代码,执行将“失败”到下一个案例。
您的检查功能可能如下所示:
void Check(char item, Stack *stack) {
switch (item) {
case '(': Push(stack, item); break;
case '[': Push(stack, item); break;
case '{': Push(stack, item); break;
case ')': if (Peek(stack) == '(') Pop(stack); break;
case ']': if (Peek(stack) == ']') Pop(stack); break;
case '}': if (Peek(stack) == '}') Pop(stack); break;
}
}
然后你像这样从 main 调用它:
Check(p, &stack);
进一步观察:
gets
。请改用 fgets
。malloc
在堆上分配 100 个字符的缓冲区。只需使用一个自动数组:char equation[100];
。如果您使用 malloc
,则在从 main
返回之前还必须使用 free
。关于c - 安排代码以分隔 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417984/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!