主题:请高手帮忙解读一下这个程序,谢谢
[size=6][size=4]这个程序是老师留的“栈”输出,但我看不懂他是怎么输出的,请帮忙讲讲各个算法实现的源程序,说明每个部分的算法设计说明,每个程序中使用的存储结构设计说明[/size][/size]
#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 20
#define FALSE 0
#define TRUE 1
//定义字符栈SqStack1,保存运算符
typedef struct
{
int top;
char elem[STACKSIZE];
}SeqStack1;
void InitStack1 (SeqStack1 &S)
{
// 构造一个最大空间为 maxsize 的空顺序栈 S
S.top = -1;
}
char GetTop1(SeqStack1 &S)
{/* 将栈S的栈顶元素弹出, 放到x所指的存储空间中, 但栈顶指针保持不变 */
if(S.top==-1) /*栈为空*/
printf("栈1为空");
else
return(S.elem[S.top]);
}
int Push1(SeqStack1 &S,char x)
{
if(S.top== STACKSIZE)
return (FALSE);/*栈已满*/
S.top++;
S.elem[S.top]=x;
return(TRUE);
}
int Pop1(SeqStack1 &S, char *x)
{ /* 将栈S的栈顶元素弹出, 放到x所指的存储空间中 */
if(S.top==-1) /*栈为空*/
return(FALSE);
else
{
*x= S.elem[S.top];
S.top--; /* 修改栈顶指针 */
return(TRUE);
}
}
//定义整数栈SqStack2,保存操作数
typedef struct
{
int top;
int elem[STACKSIZE];
}SeqStack2;
void InitStack2 (SeqStack2 &S)
{
// 构造一个最大空间为 maxsize 的空顺序栈 S
S.top = -1;
}
int GetTop2(SeqStack2 &S)
{/* 将栈S的栈顶元素弹出, 放到x所指的存储空间中, 但栈顶指针保持不变 */
if(S.top==-1) /*栈为空*/
printf("栈2为空");
else
return(S.elem[S.top]);
}
int Push2(SeqStack2 &S,int x)
{
if(S.top== STACKSIZE)
return (FALSE);/*栈已满*/
S.top++;
S.elem[S.top]=x;
return(TRUE);
}
int Pop2(SeqStack2 &S, int *x)
{ /* 将栈S的栈顶元素弹出, 放到x所指的存储空间中 */
if(S.top==-1) /*栈为空*/
return(FALSE);
else
{
*x= S.elem[S.top];
S.top--; /* 修改栈顶指针 */
return(TRUE);
}
}
int Precede(char c1,char c2)//不考虑括号运算符
{
switch(c1)
{
case'+':
case'-':if(c2=='+' ||c2=='-' ||c2=='#')
return 1;
else
return -1;
break;
case'*':
case'/':
return 1;
break;
case'#':if(c2=='#')
return 0;
else
return -1;
break;
}
}
int EvaluateExpression()
{
SeqStack1 OPTR;//运算符栈
SeqStack2 OPND;//运算数栈
char c;
int n;
char theta;
int a,b;
char x;
int abexpress;
InitStack1(OPTR);
Push1(OPTR,'#');
InitStack2(OPND);
c=getchar();
while(c!='#' || GetTop1(OPTR)!='#')
{
if(c!='+' && c!='-' && c!='*' && c!='/' && c!='#' )
{
n=c-'0'; //将接收进来的字符转换成数字后入栈
Push2(OPND,n);
c=getchar();
}
else
switch(Precede( GetTop1(OPTR),c ))
{
case -1:
Push1(OPTR,c);
c=getchar();
break;
case 1:Pop1(OPTR,&theta);
Pop2(OPND,&b);
Pop2(OPND,&a);
switch(theta)
{
case'+':abexpress=a+b;break;
case'-':abexpress=a-b;break;
case'*':abexpress=a*b;break;
case'/':abexpress=a/b;break;
}
Push2(OPND,abexpress);
break;
}
}
return GetTop2(OPND);
}
int main()
{
printf("请输入表达式,以#号结尾:");
printf("abexpress=%d",EvaluateExpression());
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 20
#define FALSE 0
#define TRUE 1
//定义字符栈SqStack1,保存运算符
typedef struct
{
int top;
char elem[STACKSIZE];
}SeqStack1;
void InitStack1 (SeqStack1 &S)
{
// 构造一个最大空间为 maxsize 的空顺序栈 S
S.top = -1;
}
char GetTop1(SeqStack1 &S)
{/* 将栈S的栈顶元素弹出, 放到x所指的存储空间中, 但栈顶指针保持不变 */
if(S.top==-1) /*栈为空*/
printf("栈1为空");
else
return(S.elem[S.top]);
}
int Push1(SeqStack1 &S,char x)
{
if(S.top== STACKSIZE)
return (FALSE);/*栈已满*/
S.top++;
S.elem[S.top]=x;
return(TRUE);
}
int Pop1(SeqStack1 &S, char *x)
{ /* 将栈S的栈顶元素弹出, 放到x所指的存储空间中 */
if(S.top==-1) /*栈为空*/
return(FALSE);
else
{
*x= S.elem[S.top];
S.top--; /* 修改栈顶指针 */
return(TRUE);
}
}
//定义整数栈SqStack2,保存操作数
typedef struct
{
int top;
int elem[STACKSIZE];
}SeqStack2;
void InitStack2 (SeqStack2 &S)
{
// 构造一个最大空间为 maxsize 的空顺序栈 S
S.top = -1;
}
int GetTop2(SeqStack2 &S)
{/* 将栈S的栈顶元素弹出, 放到x所指的存储空间中, 但栈顶指针保持不变 */
if(S.top==-1) /*栈为空*/
printf("栈2为空");
else
return(S.elem[S.top]);
}
int Push2(SeqStack2 &S,int x)
{
if(S.top== STACKSIZE)
return (FALSE);/*栈已满*/
S.top++;
S.elem[S.top]=x;
return(TRUE);
}
int Pop2(SeqStack2 &S, int *x)
{ /* 将栈S的栈顶元素弹出, 放到x所指的存储空间中 */
if(S.top==-1) /*栈为空*/
return(FALSE);
else
{
*x= S.elem[S.top];
S.top--; /* 修改栈顶指针 */
return(TRUE);
}
}
int Precede(char c1,char c2)//不考虑括号运算符
{
switch(c1)
{
case'+':
case'-':if(c2=='+' ||c2=='-' ||c2=='#')
return 1;
else
return -1;
break;
case'*':
case'/':
return 1;
break;
case'#':if(c2=='#')
return 0;
else
return -1;
break;
}
}
int EvaluateExpression()
{
SeqStack1 OPTR;//运算符栈
SeqStack2 OPND;//运算数栈
char c;
int n;
char theta;
int a,b;
char x;
int abexpress;
InitStack1(OPTR);
Push1(OPTR,'#');
InitStack2(OPND);
c=getchar();
while(c!='#' || GetTop1(OPTR)!='#')
{
if(c!='+' && c!='-' && c!='*' && c!='/' && c!='#' )
{
n=c-'0'; //将接收进来的字符转换成数字后入栈
Push2(OPND,n);
c=getchar();
}
else
switch(Precede( GetTop1(OPTR),c ))
{
case -1:
Push1(OPTR,c);
c=getchar();
break;
case 1:Pop1(OPTR,&theta);
Pop2(OPND,&b);
Pop2(OPND,&a);
switch(theta)
{
case'+':abexpress=a+b;break;
case'-':abexpress=a-b;break;
case'*':abexpress=a*b;break;
case'/':abexpress=a/b;break;
}
Push2(OPND,abexpress);
break;
}
}
return GetTop2(OPND);
}
int main()
{
printf("请输入表达式,以#号结尾:");
printf("abexpress=%d",EvaluateExpression());
system("pause");
return 0;
}