c语言编写,用数组表示栈,不用指针,编写gettop函数(取栈顶元素)

c语言编写,用数组表示栈,不用指针,编写gettop函数(取栈顶元素),第1张

int top//要求栈顶为全局变量

int gettop(int a[])

{

int e

if(top == -1)//top=-1视为栈空.视具体情况分析,也可以top==0

{

printf("栈空\n")

}

e=a[top]//取值

top-- //栈顶自拦斗碧减

return e

}

->是指针变量对结构成简举员的调用等同销顷 点符号.

//参考代码

#include <stdio.h>

#include <string.h>

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

}

/*

 *判断优先级

 * */

SElemType Precede(SElemType t1,SElemType t2)

{

SElemType f

switch(t2)

{

case '+':

case '-':

if(t1=='('||t1=='#')

f='<'

else

f='>'

break

case '*':

case '/':

if(t1=='*'||t1=='/'||t1==')')

f='>'

else

f='<'

break

case '(':

if(t1==')')

{

printf(ERROR1

)

exit(0)

}

else

f='<'

break

case ')':

switch(t1)

{

case '(':

f='='

break

case '#':

printf(ERROR2

)

exit(0)

default:

f='>'

}

break

case '#':

switch(t1)

{

case '#':

f='='

break

case '(':

printf(ERROR3

)

exit(0)

default: 

f='>'

}

}

return f

}

/*

 *搜索运算符

 * */

int In(SElemType c)

{

switch(c)

{

case'+':

case'-':

case'*':

case'/':

case'(':

case')':

case'#':return 1

default:return 0

}

}

/*

 *运算

 * */

SElemType Operate(SElemType a,SElemType theta,SElemType b)

{

SElemType c

a=a-48 //ASCII值转化为对应的十进制值

b=b-48 //ASCII值转化为对应的十进制值

switch(theta)

{

case'+':

c=a+b+48

break

case'-':

c=a-b+48

break

case'*':

c=a*b+48

break

case'/':c=a/b+48

}

return c

}

/*

 *比较运算符优先级

 * */

SElemType EvaluateExpression()

{

SqStack OPTR,OPND

SElemType a,b,c,x,theta

InitStack(&OPTR)

Push(&OPTR,'#')

InitStack(&OPND)

c=getchar()

GetTop(OPTR,&x)

while(c!='#'||x!='#')

{

if(In(c)) // 是7种运算符之一 

switch(Precede(x,c))

{

         case'<':

 Push(&OPTR,c) // 栈顶元素优先权低 

 c=getchar()

 break

         case'=':

 Pop(&OPTR,&x) // 脱括号并接收下一字符 

 c=getchar()

 break

         case'>':

 Pop(&OPTR,&theta) // 退栈并将运算结果入栈 

 Pop(&OPND,&b)

 Pop(&OPND,&a)

 Push(&OPND,Operate(a,theta,b))

 break

}

else if(c>='0'&&c<='9') // c是 *** 作数 

{

Push(&OPND,c)

c=getchar()

}

else // c是非法字符 

{

printf(非法字符!!

)

exit(0) 

}

GetTop(OPTR,&x)

}

GetTop(OPND,&x)

return x

}

int main()

{

printf(请输入算术表达式,并以#结束)

printf("%d",EvaluateExpression())

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12275649.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存