C程序设计语言 (第二版) 练习 4-4
练习 4-4 在栈操作中添加几个命令,分别用在不弹出元素的情况下打印栈顶元素;复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。
注意:代码在win32控制台运行,在不同的IDE环境下,有部分可能需要变更。
IDE工具:Visual Studio 2010
代码块:
# include <stdio.h>
# include <stdlib.h>
# include <ctype.h>
# include <string.h> # define MAXOP 100
# define NUMBER '0'
# define MAXVAL 100
# define BUFSIZE 100 int sp = 0 ;
double val[ MAXVAL] ; char buf[ BUFSIZE] ;
int bufp = 0 ; void push ( double f) { if ( sp < MAXVAL) { val[ sp++ ] = f; } else { printf ( "Error! Stack Full, can't push %g\n" , f) ; }
} double pop ( void ) { if ( sp > 0 ) { return val[ -- sp] ; } else { printf ( "Error! Stack Empty!\n" ) ; return 0.0 ; }
} void printTop ( void ) { if ( sp > 0 ) { printf ( "Top: %g\n" , val[ sp- 1 ] ) ; } else { printf ( "Error! Stack Empty!\n" ) ; }
} void topCopy ( void ) { if ( sp > 0 || sp < MAXVAL) { val[ sp++ ] = val[ sp- 1 ] ; } else if ( sp <= 0 ) { printf ( "Error! Stack Empty!\n" ) ; } else { printf ( "Error! Stack Full!\n" ) ; }
} void swapTop ( void ) { double temp; if ( sp >= 2 ) { temp = val[ sp- 1 ] ; val[ sp- 1 ] = val[ sp- 2 ] ; val[ sp- 2 ] = temp; } else { printf ( "Can't Swap Top Number!\n" ) ; }
} void emptyStack ( void ) { for ( int i = sp - 1 ; i >= 0 ; i-- ) { val[ i] = 0 ; } sp = 0 ;
} int getch ( void ) { return ( bufp > 0 ) ? buf[ -- bufp] : getchar ( ) ;
} void ungetch ( int c) { if ( bufp >= BUFSIZE) { printf ( "Ungetch! Too many characters!\n" ) ; } else { buf[ bufp++ ] = c; }
} int getop ( char s[ ] ) { int i, c; while ( ( s[ 0 ] = c = getch ( ) ) == ' ' || c == '\t' ) ; s[ 1 ] = '\0' ; if ( c == '-' ) { int next = getch ( ) ; if ( ! isdigit ( next) && next != '.' ) { ungetch ( next) ; return c; } s[ 1 ] = c = next; i = 1 ; } else { i = 0 ; if ( ! isdigit ( c) && c != '.' ) { return c; } } if ( isdigit ( c) ) { while ( isdigit ( s[ ++ i] = c = getch ( ) ) ) ; } if ( c == '.' ) { while ( isdigit ( s[ ++ i] = c = getch ( ) ) ) ; } s[ i] = '\0' ; if ( c != EOF ) { ungetch ( c) ; } return NUMBER;
} int main ( ) { for ( double i = 0.0 ; i < 10.0 ; i++ ) { push ( i) ; } printTop ( ) ; swapTop ( ) ; printTop ( ) ; topCopy ( ) ; printTop ( ) ; emptyStack ( ) ; printTop ( ) ; system ( "pause" ) ; return 0 ;
}