user-0 提问: 链栈的出栈函数执行两次，出来的返回值（被删除的栈顶元素）却一样，请问这是怎么一回事？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复：入栈代码也发一下吧，这个出栈函数有点问题但看不出关键错误你好，完整代码我已经发在下面啦，谢谢！

user: user-0
content: #include<stdio.h> #include<stdlib.h>  typedef struct SNode//定义运算符OPTR数据类型 {     char data;     struct SNode * next; }OpStack,*LinkStack;  typedef struct SNode1 //定义运算数OVS数据类型 {     float data1;     struct SNode1 * next; }OvStack,*LinkStack1;  void push(OpStack *s,char n)//在运算符栈的顶部插入n {     OpStack *temp;     temp=(OpStack *)malloc(sizeof(OpStack));     temp->data=n;     temp->next=s->next;     s->next=temp; }  void push1(OvStack *s,float n)//在运算数栈的顶部插入n {     OvStack *temp;     temp=(OvStack*)malloc(sizeof(OvStack));     temp->data1=n;     temp->next=s->next;     s->next=temp; }  int pop(OpStack *top,char *x) //将运算符栈顶元素p弹出，放到x所指的存储空间中 {     OpStack *p;     p=top->next;//定义p为第一个元素     if(top==NULL) return 0;     *x=p->data;     top->next=p->next;     free(p);//释放p     return 1; }  int pop1(OvStack *top,float *y) //将运算数栈顶元素p弹出，放到y所指的存储空间中 {      OvStack *p;     p=top->next;//定义p为第一个元素     if(top==NULL) return 0;     *y=p->data1;     top->next=p->next;     free(p);//释放p     return 1; }  char GetTop(OpStack *s) //取运算符栈顶元素 {     char n;     n=s->next->data;     return n; }  float GetTop1(OvStack *s) //取运算数栈顶元素 {     float n;     n=s->next->data1;     return n; }  char Compare(char a,char b) //比较运算符的优先级 { 	if(a=='(')     { 		switch (b) 		{ 	    case '#': return ' ';break; 		case '+': return '<';break; 		case '-': return '<';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '(': return '<';break; 		case ')': return '='; break; 		}      }  	if(a==')')     { 		switch (b) 		{ 	    case '#': return '>';break; 		case '+': return '<';break; 		case '-': return '<';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '(': return '<';break; 		case ')': return ' '; break; 		}      } 	if(a=='#')     {        switch (b) 		{ 	    case '#': return '=';break; 		case '+': return '<';break; 		case '-': return '<';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '(': return '<';break; 		case ')': return ' '; break; 		}     }  	if(a=='+') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	if (a=='-') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '<';break; 		case '/': return '<';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	if (a=='*') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '>';break; 		case '/': return '>';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	if (a=='/') 	{ 		switch (b) 		{ 		case '+': return '>';break; 		case '-': return '>';break; 		case '*': return '>';break; 		case '/': return '>';break; 		case '#': return '>';break; 		case '(': return '<';break; 		case ')': return '>'; break; 		} 	} 	return 0; }  float GetNumber(char *ch) //将输入的char类型值，若不是字符，转换为数值 { 	char temp[50];float m; 	int j=0;int i=0; 	while(ch[i]!='+'&&ch[i]!='-'&&ch[i]!='*'&&ch[i]!='/'&&ch[i]!='#'&&ch[i]!='\0'&&ch[i]!='('&&ch[i]!=')') 	{ 		temp[j]=ch[i];i++;j++; 	} 	m=atof(temp); //string转化为float型 	return m; }  int In(char ch)  //判断输入字符是否为字符,n==1时代表输入字符为字符，n==0时代表输入字符为数字 { 	if(ch=='+') return 1; 	else if(ch=='-') return 1; 	else if(ch=='*') return 1; 	else if(ch=='/') return 1; 	else if(ch=='#') return 1; 	else if(ch=='(') return 1; 	else if(ch==')') return 1; 	else return 0; }  float Excute(float a,char op,float b)  //对a,b执行基本运算 {     switch(op)     {         case '+':return (a+b); break;         case '-':return (a-b); break;         case '*':return (a*b); break;         case '/':return (a/b); break;         default:return 0;     } }  float ExpEvalution(OpStack *OPTR,OvStack *OVS,char *ch)  //表达式求值 {     float x,a,b,v;     char op,n;     int i=0;      push(OPTR,'#');      while(ch[i]!='#'||GetTop(OPTR)!='#')     {         if(In(ch[i])==0) //ch为数字         {             x=GetNumber(ch);             push1(OVS,x);             //while(ch[i]!='+'&&ch[i]!='-'&&ch[i]!='*'&&ch[i]!='/'&&ch[i]!='#'&&ch[i]!='\0'&&ch[i]!='('&&ch[i]!=')')             i++;         }         else          if(ch[i]=='(')          {              push(OPTR,ch[i]);              i++;              continue;          }          else          {                 switch(Compare(ch[i],GetTop(OPTR)))                 {                     case'=':                         pop(OPTR,&n);                         i++;                         break;                     case'>':                         push(OPTR,ch[i]);                         i++;                         break;                     case'<':                         pop1(OVS,&a);                         pop1(OVS,&b);                         pop(OPTR,&op);                         v=Excute(a,op,b);                         push1(OVS,v);                         break;                     case' ':                         break;                  }          }     }     return (GetTop1(OVS)); }  int main() {      OvStack *ovs1,*ovs2,*ovs3; 	OpStack *oprt1,*oprt2,*oprt3; 	float Value1,Value2,Value3;     char ch1[100],ch2[100],ch3[100];  	oprt1=(OpStack*)malloc(sizeof(OpStack)); 	oprt2=(OpStack*)malloc(sizeof(OpStack)); 	oprt3=(OpStack*)malloc(sizeof(OpStack));  	ovs1=(OvStack*)malloc(sizeof(OvStack));     ovs2=(OvStack*)malloc(sizeof(OvStack));     ovs3=(OvStack*)malloc(sizeof(OvStack));      fgets(ch1,100,stdin); 	fgets(ch2,100,stdin); 	fgets(ch3,100,stdin);  	Value1=ExpEvalution(oprt1,ovs1,ch1); 	Value2=ExpEvalution(oprt2,ovs2,ch2); 	Value3=ExpEvalution(oprt3,ovs3,ch3);      int a=(int)Value1;//强制类型转换     int b=(int)Value2;     int c=(int)Value3;  	printf("%d\n",a); 	printf("%d\n",b); 	printf("%d\n",c);  	return 0; }

user: user-0
content: 这个问题已经解决，是GetNumber函数的问题

user: user-1
content: 入栈代码也发一下吧，这个出栈函数有点问题但看不出关键错误