C 蹦蹦跳跳;从多类型堆栈获取值
我有一个堆栈(使用链表结构实现),它包含两种类型:char*(保存字符串的值)和double(保存数字的值)。 我有一个Pop函数,它是void,从堆栈中弹出顶部值。但我也希望能够获得这种价值C 蹦蹦跳跳;从多类型堆栈获取值,c,linked-list,stack,C,Linked List,Stack,我有一个堆栈(使用链表结构实现),它包含两种类型:char*(保存字符串的值)和double(保存数字的值)。 我有一个Pop函数,它是void,从堆栈中弹出顶部值。但我也希望能够获得这种价值 但是我不知道怎么做,因为我不能在C中重载函数,这将允许我有两个返回各自类型的Pop函数(一个是char*,另一个是double类型)。有人知道另一种方法吗? 以下是我迄今为止的代码: #包括 #包括 #包括 #包括 #包括 #包括 typedef结构堆栈 { char*valC; 双谷; 结构堆栈*下一
#包括
#包括
#包括
#包括
#包括
#包括
typedef结构堆栈
{
char*valC;
双谷;
结构堆栈*下一步;
}节点;
node*head=NULL;
整数isnumber(字符*str)
{
int i;
对于(i=0;str[i]!='\0';i++)
{
if(!isdigit(str[i]))
返回(0);
}
申报表(1);
}
节点*获取节点(无效*项)
{
节点*温度;
temp=(node*)malloc(sizeof(node));
如果(temp==NULL)printf(“无法分配内存”);
温度->价值=项目;
temp->next=NULL;
返回(临时);
}
无效推送(字符*项,双数字,节点**头)
{
node*New=(node*)malloc(sizeof(node));
如果(New==NULL)printf(“无法分配内存”);
新建->值=num;
新建->增值=项目;
//节点*获取节点(void*);
//新建=获取节点(项目);
新建->下一步=*头部;
*头=新的;
}
int Sempty(节点*temp)
{
if(temp==NULL)
返回1;
其他的
返回0;
}
void Pop(节点**头部)
{
字符*项目;
双项n;
节点*温度;
node*prev=(node*)malloc(sizeof(node));
//项目=(*总目)->valC;
//itemN=(*head)->valNum;
温度=*水头;
上一个->下一个=温度;
*头部=(*头部)->下一个;
免费(临时);
如果(上一个->值!=NULL)
{
返回(上一个->值);
}
否则如果(上一个->值>0)
{
返回(上一个->值);
}
}
双PopN(节点**头)
{
双项n;
节点*温度;
itemN=(*head)->valNum;
温度=*水头;
*头部=(*头部)->下一个;
免费(临时);
返回(项目n);
}
无效显示(节点**头)
{
节点*温度;
温度=*水头;
字符*错误;
if(表面(温度)){
printf(“空堆栈!\n”);
error=“::error::\n”;
推送(错误、0和温度);
}
其他的
{
while(temp!=NULL)
{
如果(temp->valC!=NULL)printf(“%s\n”,temp->valC);
如果(temp->valNum>0)printf(“%f\n”,temp->valNum);
温度=温度->下一步;
}
}
}
void main()
{
node*inp=(node*)malloc(sizeof(node));;
而(1)
{
printf(“repl>”);
字符*存储[30];
char*tok;
加倍我的双倍;
字符缓冲区[50];
int pos=0;
fgets(缓冲区、sizeof(缓冲区)、stdin);
tok=strtok(缓冲区“”);
while(tok!=NULL)
{
如果(strcmp(tok,“add”)==0)printf(“YES!!”);
如果(strcmp(tok,“add\n”)==0)printf(“YELZZ!!!”);
如果(strcmp(tok,“退出”)==0)退出(1);
否则如果(strcmp(tok,“quit\n”)==0)退出(1);
如果(strcmp(tok,“pop”)==0)
{
波普(头部);
打破
}
else if(strcmp(tok,“pop\n”)==0)
{
波普(头部);
打破
}
如果(sscanf(tok、%lf、&my_double)>0)
{
推送(空,我的双,头);
}
其他的
推压(标准向上(tok)、0和头部);
//if(Sempty(head))推送(“::错误:”,0,&head);
tok=strtok(空,“”);
}
显示器(&head);
}
}您可以做的一件事是编写一个void*类型的指针,然后您可以稍后将其类型转换为所需的类型 我将给出一个示例,您可以从中获得实现pop()的想法 对于pop(),您甚至可以添加as flag作为参数,以了解调用函数中类型转换返回指针的类型。作为
void * pop(node **head, int &flag)
设置标志以指示返回指针的类型。您不能在C中重载函数。您已经有了一个从堆栈中弹出最顶层节点的Pop函数。节点可以包含数字或字符串。显示功能显示节点的内容,并正确测试节点中的数据类型 您应该编写一个函数,将节点作为参数,如果是数字,则返回say false;如果是字符串,则返回true:
bool IsString(node *inp)
{
return temp->valC != NULL ;
}
但是,即使可以在C中重载函数,也不知道堆栈顶部是什么类型的节点(数字或字符串)。如果调用返回字符串的Pop函数,并且最顶端的节点包含数字,会发生什么情况
只需执行pop,然后确定节点是字符串还是数字,并相应地执行操作。您的pop函数是无效的,但您仍从中返回一个值。Thios不编译。是的,我正在测试它,它可以编译,但当然不能正常工作@MichaelWalz@MannyO您希望从pop返回2个值,并且可以更改pop()函数的签名吗?请打开所有警告。至于这个问题-您可能需要实现一些序列化。@Rohith yes您可以调整sig
void * pop(node **head, int &flag)
bool IsString(node *inp)
{
return temp->valC != NULL ;
}