#include "stdio.h"
#include "stdlib.h"
typedef struct snode
{
char data
struct snode *next
}Node
void Inist (Node **head) //栈的初始化
{
if((*head=(Node *)malloc(sizeof(Node)))==NULL)
(*head)->next=NULL
}
int NotEmpty(Node *head)//判断是否非空
{
if(head->next==NULL) return 0
else return 1
}
int Push(Node *head,char x) //入栈携慎段
{
Node *p
if((p=(Node *)malloc(sizeof(Node)))==NULL)
{
printf("内存空间不足无法插入")
return 0
}
p->data=x
p->next=head->next
head->next=p
return 1
}
int Pop(Node *head,char *x) //出栈
{
Node *p=head->next
if(p==NULL)
{
printf("堆栈已空出错!")
return 0
}
head->next=p->next
*x=p->data
free(p)
return 1
}
int Gettop(Node *head,char *x) //取栈顶元素
{
Node *p=head->next
if(p==NULL)
{
printf("堆栈已空出错!")
return 0
}
*x=p->data
return 1
}
int Compare(char a,char b) //比较 *** 作符优先级
{
if((a=='+'||a=='-')&&(b=='*'||b=='/'||b=='('))
return '<'
else if ((a=='*'||a=='/')&&b=='(')
return '<'
else if (a=='('&&(b=='+'||b=='-'||b=='*'||b=='/'||b=='('))
return '<'
else if (a=='('&&b==')')
return '='
else if (a=='#'&&(b=='+'||b=='-'||b=='*'||b=='/'||b=='('))
return '<'
else if (a=='#'&&b=='#')
return '孝森='
else
return '>'
}
int Houzhui(char Original[],int n,char save[]) //中缀变后缀
{
Node *s
char x1,x2,y
int i
int j=0
Inist(&s)
Push(s,'#')
for(i=0i<ni++)
{
x1=Original[i]
if(x1<='9'&&x1>='0')
{
save[j]=x1 //将数字保存在数组save中
j++
y=Original[i+1]
if(y=='+'||y=='-'||y=='*'||y=='/'||y=='('||y==')'||y=='#')
{
save[j]=' ' //在数字后面, *** 作符前面加空格
j++
}
}
else
{
Gettop(s,&x2) //取栈顶元素进行比较
if(Compare(x2,x1)=='<') //栈顶元素低级就将X1进栈
Push(s,x1)
else if(Compare(x2,x1)=='>') //栈顶元素高级就将X2出栈
{
Pop(s,&x2)
save[j]=x2 //将 *** 作符X2保存在数组save中
j++
i--
}
else if(Compare(x2,x1)=='=')
Pop(s,&x2) //优先级相同就将X2出栈
}
}
save[j]='#' //后缀表达式以'#'号结束
return j//返回数组save的长度
}
void Count(char p[]) //后缀表达式求值
{
int s[100]
int i,j
i=j=0
while(p[j]!='#')
{
switch(p[j])
{
case '+': //将 *** 作符前面的两个数值相加
s[i-2]=s[i-2]+s[i-1]
i=i-1
break
case '-': //将 *** 作符前面的两个数值相减
s[i-2]=s[i-2]-s[i-1]
i=i-1
break
case '*': //将 *** 作符前面的两个数值相乘
s[i-2]=s[i-2]*s[i-1]
i=i-1
break
case '/': //将 *** 作符前面的两个数值相除
s[i-2]=s[i-2]/s[i-1]
i=i-1
break
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
s[i]=(int)p[j]-48
//将数字字符char型向int类型转换
j++
while(p[j]!=' ')
//判断一个 *** 作数是否结束,每个 *** 作数都是以空格结束
{
s[i]=s[i]*10+(int)p[j]-48 //求出数字字符的值
j++
}
i++
break
}
j++
}
printf("\n计算的结果为: %d",s[0])
}
void main()
{
int m
int i=0
int k
char save[100]
char a[100]
printf("输入字符串,并以#号结束 \n")
for(m=0m<100m++) //输入表达式字符串
{
scanf("%c",&a[m])
if(a[m]=='#')break
}
k=Houzhui(a,m+1,save)//调用函数houzhui
printf("后缀表达式为:")
for(m=0m<km++)
printf("%c",save[m])
Count(save) //调用函数ji_suan
printf("\n")
}
第一个程序有两个错误:错误一:
SeqList *L
init_SeqList(L)
应改成:
SeqList s
SeqList *L = &s
init_SeqList(L)
错误原因:指针只有在初始化(即只有在指向具体对象)之后才可以参与运算,你只定义了一个指针,并未将指针指向具体的对象,当执行到init_SeqList(L)这句时,会产生越界报错。
错误二:
printf("%d\t%s\n"肢兆消,L->elem[1].data,L->elem[1].n)
这个语句打印出来的永远是第一个元素,而不是删除的元素,应改成:
printf("%d\t%s\n",L->elem[i].data,L->elem[i].n)//其中i为被删除元素的下标
提示:
给数组赋值历知时,循环最好从i=0开始,for(i=1i<=2i++)你从i=1开始,实际上是将值赋给了数组的第二个元素猜没。
这是个二叉排咐慧序树例题,希望对你有帮助!#include
"stdio.h"
#
include
"stdlib.h"
struct
Bnode
{int
data
struct
Bnode
*lchild,*rchild
}
void
insertbst(Bnode
*&t,
Bnode
*s)
{if
(t==
NULL)
t=s
else
if
(s->data<
t->data)
insertbst(t->
lchild,s)
else
insertbst(t->
rchild,s)
}
void
inorder(Bnode
*t)
{
if
(t!=NULL)
{
inorder(t->lchild)
printf("%d
",
t->data)
inorder(t->rchild)
}
}
void
main()
{int
i,x
Bnode
*t=NULL,*s
for
(i=1i<=4i++)
{scanf("%d",&x)
s=(
Bnode
*)malloc(sizeof(Bnode))
s->data=x
s->
lchild=
NULL
s->
rchild=
NULL
printf("搏和\n"衡银答)
insertbst(t,s)
}
inorder(
t)
printf("\n")
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)