C语言数据结构数的实验

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define STACK_INIT_SIZE 50

typedef int Status;
typedef char ElemType;

//树节点
typedef struct BiTNode{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree; 
//栈结构
typedef struct{
	BiTNode *base;
	BiTNode *top;
	int stacksize;
}SqStack;
//1初始化栈
Status InitStack(SqStack &s)
{
	s.base=(BiTNode *)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
	if(!s.base) exit(OVERFLOW);
	s.top=s.base;
	s.stacksize=STACK_INIT_SIZE;
	return OK;
} 
//2取栈顶元素 
BiTNode *Top(SqStack s)
{
	if(s.top==s.base)return ERROR;
	return s.top-1;
 } 
//3入栈
Status Push(SqStack &s,BiTree e)
{
	if((s.top-s.base)>=s.stacksize)
	{
		printf("内存不足\n");
		return ERROR;
	}
	s.top->data=e->data;
	s.top->lchild=e->lchild;
	s.top->rchild=e->rchild;
	s.top++;
	return OK;
 } 
//4出栈 
Status Pop(SqStack &s)
{
	if((s.top==s.base))return ERROR;
	--s.top;
	return OK;
}
//5判断栈空
int StackEmpty(SqStack S)
{
	if(S.top==S.base)
	return 1;
	else
	return 0;
} 
//先序创建二叉树
BiTree Create(BiTree T)
{
	ElemType ch;
	ch=getchar();
	if(ch=='#')
	 T=NULL;
	else
	{
		T=(BiTNode *)malloc(sizeof(BiTNode));
		T->data=ch;
		T->lchild=Create(T->lchild);
		T->rchild=Create(T->rchild);
	}
	return T;
} 
//使用栈的前序遍历的非递归算法
void PreOrderNoRec(BiTree BT)
{
	SqStack S;
	InitStack(S);
	BiTree p=BT;
	while((NULL!=p)||StackEmpty(S))
	{
		if(NULL!=p)
		{
			printf("%c",p->data);
			Push(S,p);
			p=p->lchild;
		}
		else{
			p=Top(S);
			Pop(S);
			p=p->rchild;
		}
	}
 } 
 //使用栈的中序遍历非递归算法
 void IneOrderNoRec(BiTree BT)
 {
 	SqStack S;
 	InitStack(S);
 	BiTree p=BT;
 	while((NULL!=p)||!StackEmpty(S))
 	{
 		if(NULL!=p)
 		{
 			Push(S,p);
 			p=p->lchild;
		 }
		 else{
		 	p=Top(S);
		 	Pop(S);
		 	printf("%c",p->data);
		 	p=p->rchild;
		 }
	 }
  } 
void PreOrderTraverse(BiTree T)
{//先序遍历二叉树 
	if(T){
		printf("%c",T->data);//访问节点
		PreOrderTraverse(T->lchild);//遍历左
		PreOrderTraverse(T->rchild);//遍历右 
	}	
}
void (BiTree T)
{//中序遍历InOrderTraverse二叉树 
	if(T){
		InOrderTraverse(T->lchild);
		printf("%c",T->data);
		InOrderTraverse(T->rchild);
	}
 } 
void PostOrderTraverse(BiTree T)
{
 	if(T){
 		PostOrderTraverse(T->lchild);
 		PostOrderTraverse(T->rchild);
 		printf("%c",T->data);
	 }
}
//主函数
int main()
{
	BiTree T;
	SqStack S;
	printf("请按先序次序输入二叉树结点的值(一个字符),用#表示空树:\n");
	T=Create(T);
	printf("\n二叉树先序非递归遍历结果是:");
	PreOrderNoRec(T);

	return 0;
 } 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构实验 #include <stdio.h> #include <stdlib.h> #include <string.h> #define NULL 0 #define OK 1 #define ERROR -1 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 20 /*定义字符类型栈*/ typedef struct{ int stacksize; char *base; char *top; } Stack; //栈的类型 /* 定义整型栈*/ typedef struct{ int stacksize; //栈类型个 int *base; int *top; } Stack2; /* ----------------- 全局变量--------------- */ Stack OPTR; /* 定义运算符栈*/ Stack2 OPND; /* 定义操作栈*/ char expr[255] = ""; /* 存放表达式串*/ char *ptr = expr; int InitStack(Stack *s) //构造运算符栈 { s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char)); //建立新结点 if(!s->base) return ERROR; s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int InitStack2(Stack2 *s) //构造操作栈 { s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s->base) return ERROR; s->stacksize=STACK_INIT_SIZE; s->top=s->base; return OK; } int In(char ch) //判断字符是否是运算符,运算符即返回1 { return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#'); } int Push(Stack *s,char ch) //运算符栈插入ch为新的栈顶元素 { *s->top=ch; s->top++; return 0; } int Push2(Stack2 *s,int ch)//操作栈插入ch为新的栈顶元素 { *s->top=ch; s->top++; return 0; } char Pop(Stack *s) //删除运算符栈s的栈顶元素,用p返回其值 { char p; s->top--; p=*s->top; return p; } int Pop2(Stack2 *s)//删除操作栈s的栈顶元素,用p返回其值 { int p; s->top--; p=*s->top; return p; } char GetTop(Stack s)//的栈顶元素 { char p=*(s.top-1); return p; } int GetTop2(Stack2 s) //用p返回操作栈s的栈顶元素 { int p=*(s.top-1); return p; } /* 判断运算符优先权,返回优先权高的*/ char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ //array是组 '>', '>', '<', '<', '<', '>', '>', '>', '>', '<', '<', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '<', '<', '<', '<', '<', '=', '!', '>', '>', '>', '>', '!', '>', '>', '<', '<', '<', '<', '<', '!', '='}; switch(c1) { /* i为下面array的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break; case '/' : i=3;break; case '(' : i=4;break; case ')' : i=5;break; case '#' : i=6;break; } switch(c2) { /* j为下面array的纵标 */ case '+' : j=0;break; case '-' : j=1;break; case '*' : j=2;break; case '/' : j=3;break; case '(' : j=4;break; case ')' : j=5;break; case '#' : j=6;break; } return (array[7*i+j]); /* 返回运算符 */ } /*操作函 */ int Operate(int a,char op,int b) { switch(op) { case '+' : return (a+b); case '-' : return (a-b); case '*' : return (a*b); case '/' : return (a/b); } return 0; } int num(int n)//返回操作的长度 { char p[10]; itoa(n,p,10);//把整型转换成字符串型 n=strlen(p); return n; } int EvalExpr()//主要操作函 { char c,theta,x; int n,m; int a,b; c = *ptr++; while(c!='#'||GetTop(OPTR)!='#') { if(!In(c)) { if(!In(*(ptr-1))) ptr=ptr-1; m=atoi(ptr);//取字符串前面的字段 n=num(m); Push2(&OPND,m); ptr=ptr+n; c=*ptr++; } else switch(Precede(GetTop(OPTR),c)) { case '<': //栈顶元素优先权低 Push(&OPTR,c); c = *ptr++; break; case '=': //脱括号并接收下一字符 x=Pop(&OPTR); c = *ptr++; break; case '>': //退栈并将运算结果入栈 theta=Pop(&OPTR); b=Pop2(&OPND); a=Pop2(&OPND); Push2(&OPND,Operate(a,theta,b)); break; } } return GetTop2(OPND); } int main( ) { printf("请输入正确的表达式以'#'结尾:"); do{ gets(expr); }while(!*expr); InitStack(&OPTR); /* 初始化运算符栈 */ Push(&OPTR,'#'); /* 将#压入运算符栈 */ InitStack2(&OPND); /* 初始化操作栈 */ printf("表达式结果为:%d\n", EvalExpr()); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值