利用栈实现表达式树这里我一共有两种思路:
part one:
首先判断输入表达式的每个字符,如果遇到运算符,不压栈,
接着弹出两个栈顶的元素,进行元素,接着把结果压栈。
代码:
//栈实现表达式
//思路:此程序的思路是,读取输入的字符串,然后判断每个字符,
//当遇到的是运算符,这时运算符不如栈,接着把栈顶的两个元素
//出栈,然后运算,然后再将得的结果压栈
//杨鑫
#include
#include
typedef int SElemType;// 栈的元素类型
#define STACK_INIT_SIZE 10// 存储空间初始分配量
#define STACKINCREMENT 2// 存储空间分配增量
/*
*顺序栈的结构体
* */
typedef struct SqStack
{
SElemType *base;// 在栈构造之前和销毁之后,base的值为NULL
SElemType *top;// 栈顶指针
int stacksize;// 当前已分配的存储空间,以元素为单位
}SqStack;
/*
*构造一个栈
* */
int InitStack(SqStack *S)
{
// 为栈底分配一个指定大小的存储空间
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if( !(*S).base )
exit(0);// 存储分配失败
(*S).top = (*S).base;// 栈底与栈顶相同表示一个空栈
(*S).stacksize = STACK_INIT_SIZE;
return 1;
}
/*
*获取栈顶元素
* */
int GetTop(SqStack S,SElemType *e)
{
if(S.top > S.base)
{
*e = *(S.top-1);// 栈顶指针的下一个位置为栈顶元素
return 1;
}
else
return 0;
}
/*
*入栈(压栈)
* */
int Push(SqStack *S, SElemType e)
{
if((*S).top - (*S).base >= (*S).stacksize)// 栈满,追加存储空间
{
(*S).base = (SElemType *)realloc((*S).base,
((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));
if( !(*S).base )
exit(0); // 存储分配失败
(*S).top = (*S).base+(*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
*((*S).top)++=e;
// 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左
return 1;
}
/*
*出栈
* */
int Pop(SqStack *S,SElemType *e)
{
if((*S).top == (*S).base)
return 0;
*e = *--(*S).top;
// 这个等式的++ * 优先级相同,但是它们的运算方式,是自右向左
return 1;