第三章(6).栈的应用举例(2)
来源:互联网 发布:异星工厂电路网络 编辑:程序博客网 时间:2024/06/16 00:27
以链栈基本操作为基础
//-----------------应用举例操作-------------------//
//Hanoi塔问题
void move( char x , int n , int z )
{
static int c = 0 ; //对搬动计数
printf( "%i.Move disk %i from %c to %c\n" , ++c , n , x , z ) ;
}void Hanoi( int n , char x , char y , char z )
{ //将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘按规则搬到塔座z上,y可做辅助塔座
if( n == 1 )
move( x , 1 , z ) ; //将编号为1的圆盘从x移至z.
else
{
Hanoi( n-1 , x ,z , y ) ; //将x上编号为1至n-1的圆盘移至y,z做辅助塔
move( x , n , z ) ; //将编号n的盘从圆盘从x移到z.
Hanoi( n-1 , y , x , z ) ;
}
}//------------------------------------------------------//
//在此只讨论简单算术表达式的求值问题。(+,-,*,/) 因为数据元素也是以字符格式处理的,所以进行的元素为0-9之间.(如果想要改为处理任意数,则需对两个栈进行区别化处理)
ElemType Precede( ElemType theta , ElemType thetb )
{
ElemType cmp ;
switch( thetb )
{
case '+':
case '-':if(theta =='('||theta=='#') cmp = '<';
else cmp = '>' ; break ;
case '*':
case '/':if( theta=='*'||theta=='/'||theta==')') cmp = '>' ;
else cmp = '<' ; break ;
case '(':if(theta==')')
{
printf("ERROR!\n");
exit( 0 ) ;
}
else cmp = '<' ; break ;
case ')':if(theta=='(') cmp = '=' ;
else{
if(theta =='#')
{
printf("ERROR!\n");
exit( 0 ) ;
}
else cmp = '>' ;
}
break ;
case '#':if(theta=='(')
{
printf("ERROR!\n");
exit( 0 ) ;
}
else
{
if(theta =='#') cmp = '=' ;
else cmp = '>' ;
}
break ;
}
return cmp ;
}ElemType Operate( ElemType a , ElemType theta , ElemType b )
{
ElemType c ;
a -= 48 ; b -= 48 ;
switch( theta )
{
case '+': c = a+b+48 ; break ;
case '-': c = a-b+48 ; break ;
case '*': c = a*b+48 ; break ;
case '/': if( b ) c = a/b+48 ; break ;
}
return c ;
}//int In( ElemType c ,ElemType *OP ) //OP为运算符集,但在此处可以内置,因为我们进行的运算只是简单的几种算术运算
int In( ElemType c )
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return 1 ;
return 0 ;
}ElemType EvaluteExpression( )
{ //算数表达式求值的算符优先算法。OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
LinkStack OPTR , OPND ;
ElemType a , b , c , x , theta;InitStack( &OPTR ) ; Push( &OPTR , '#' ) ; //运算符和运算数统一为字符格式,便于处理,不然两个栈就需要不同元素的类型.带来处理上的麻烦!
InitStack( &OPND ) ; c = getchar( ) ;
while( c != '#' || GetTop( OPTR )!= '#')
{
if( !In( c ) ) //不是运算符则进栈
{
Push( &OPND , c ) ;
c = getchar( ) ;
}
else
{
switch( Precede( GetTop(OPTR) , c ) )
{
case '<':Push( &OPTR , c ) ; c = getchar( ) ; break ; //栈顶元素优先级低
case '=':Pop( &OPTR , &x ) ; c = getchar( ) ; break ;
case '>':Pop( &OPTR , &theta ) ; Pop( &OPND , &a ) ; Pop( &OPND , &b ) ;Push( &OPND , Operate( b , theta , a ) ) ;break ;
}
}
}
return GetTop( OPND ) ;
}
//---------------------------------------------------//
int main( )
{
// char x , y , z ;
// Hanoi( 3 , 'x' , 'y' , 'z' ) ;printf( "%d\n" , EvaluteExpression( )- 48 ); //测试用例4+2*3-9/3#
return 0 ;
}
- 第三章(6).栈的应用举例(2)
- 第三章(5).栈的应用举例(1)
- 第三章(7).栈的应用举例(3)
- 数据结构:栈的应用举例(严蔚敏版)
- 栈的应用举例2(迷宫求解)
- 栈的应用举例
- 栈的应用举例
- 栈的应用举例
- 栈的应用举例
- 栈的应用举例
- 栈和队列(二):栈的应用举例
- 栈的应用举例3(表达式求值)
- 基于图(graph)的应用举例
- JAVA疯狂讲义第三版4.6.6数组的应用举例代码功能扩展
- 3.2栈的应用举例
- 栈的应用举例1
- 栈的应用举例--递归
- 3.2栈的应用举例
- 第三章(2).链栈
- 第三章(3).链队列
- 第三章(4).循环队列
- 第三章(5).栈的应用举例(1)
- PL/SQL Developer 7.1.5 注册版
- 第三章(6).栈的应用举例(2)
- 第三章(7).栈的应用举例(3)
- 第四章(1)定长顺序存储表示
- 第四章(2).堆分配存储表示
- 第四章(3).块链存储表示
- 第五章(1)数组的顺序表示和实现
- 第五章(2)三元组顺序表
- 第五章(3)行逻辑链接的顺序表
- 第五章(4)十字链表