gpt4 book ai didi

c - 使用 C 实现堆栈得到错误 : is a pointer; did you mean to use ‘->’ ?

转载 作者:太空宇宙 更新时间:2023-11-04 06:52:56 25 4
gpt4 key购买 nike

我正在尝试实现一个堆栈来解决括号问题,但我对指针感到困惑(我是 C 的新手)到目前为止,这是我的代码:

typedef struct node{
char data;
struct node *next;
}node;
typedef struct stack{
struct node **head;
}stack;
void push(stack *s, char c){
node *n = (node *)malloc(sizeof(node));
n->data = c;
if(*s->head == NULL){
n->next = *s->head;
*s->head = n;
}
else{
n->next = *s->head;
*s->head = n;
}
}
void pop(stack *s){
if(s->head->next == NULL){
*s->head = NULL;
}
else{
node *temp = *s->head;
*s->head = s->head->next;
free(temp);
}
}
bool isStringBalanced(char** sentence, int size){
stack *s = malloc(sizeof(stack));
*s->head = NULL;
for(int i = 0; i < size; i++){
int j = 0;
while(sentence[i][j] != '\0'){
switch(sentence[i][j]){
case '(' : push(s, '('); break;
case '[' : push(s, '['); break;
case '{' : push(s, '{'); break;
case ')' :
if(*s->head)
if(*s->head->data == '(')
pop(s);
else return false;
else return false;
break;
case ']' :
if(*s->head)
if(*s->head->data == '[')
pop(s);
else return false;
else return false;
break;
case '}' :
if(*s->head)
if(*s->head->data == '{')
pop(s);
else return false;
else return false;
break;
}
j++;
}
}
if(!s->head)
return true;
else
return false;
}

当我尝试运行它时,我在所有双箭头上遇到错误,例如 s->head->data 和 s->head->next帮助我了解如何使用右双指针谢谢。

最佳答案

双指针是指向指针的指针。它很有用,例如当你希望函数更改指针指向的位置:

void foo(char **str)
{
*str = "World";
}

void bar(void)
{
const char *x = "Hello";
puts(x); // points to "Hello"
foo(&x);
puts(x); // points to "World"
}

这将打印1:

World
Hello

双指针可用于存储数组或指针的数组。这例如可以用于存储矩阵。

在你的例子中,stack 中的双指针是不需要的,它在一个结构。当然你可以将它声明为双指针,但它会让 live不必要地更难。 head 已经在一个结构中,你通常通过stack 对象作为一个整体。所以功能改变的指向位置head 不需要双指针就可以做到这一点,因为 head 不是一个变量,它是一个结构的成员(见下面的例子)。

因此您可以将其重写为:

typedef struct stack{
struct node *head;
}stack;

那么push可以重写为:

int push(stack *s, char c)
{
node *n = calloc(1, sizeof *n);
if(n == NULL)
return 0;

n->data = c;
n->next = s->head;
s->head = n; // see footnote 2
}

关于->.的问题:->.是用来访问结构的成员。如果变量(或表达式)不是指针,则使用 .,如果变量(或表达式)是一个指针,那么你使用->。就这么简单那:

// Note these examples show only how to use -> and .

stack *s;
s->next; // because s is a pointer
s->next->next; // because s->next is a pointer
s->next->next->data // because s->next->next is a pointer

stack s;
s.next; // because s is not a pointer
s.next->next; // because s is not a pointer, but s.next is a pointer
s.next->next->data; // because s is not a pointer, but s.next is a pointer
// and s.next->next is also a pointer

注释

1字符串文字(引号中的)返回where的地址字符序列被存储。在 C 中,字符串只是一个序列以 '\0' 终止字节结尾的字符。

当你做的时候

const char *x = "Hello";

没有将字符串复制到x,您正在分配位置顺序

base = some memory location

base
+---+---+---+---+---+----+
| H | e | l | l | o | \0 |
+---+---+---+---+---+----+

char 到指针xx 的值是地址 base

2感谢用户user7231指出在这种情况下甚至if(n->head == NULL) 检查不是必需的。我已经使用更新了我的答案他/她的台词。归功于user7231 .

关于c - 使用 C 实现堆栈得到错误 : is a pointer; did you mean to use ‘->’ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633345/

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