取栈顶 int GetTop( linkStack*S, StackData &x)i if( StackEmpty(S)) return 0; X=S->top->data return 1 置栈空 int MakeEmpty( LinkStack *S)t While(s->top!=NULL StackNode x p=S->top S->top=S-top ->ink; free(p);
▪ 取栈顶 int GetTop ( LinkStack *S, StackData &x ) { if ( StackEmpty (S) ) return 0; x = S->top->data; return 1; } ▪ 置栈空 int MakeEmpty ( LinkStack *S) { While(S->top!=NULL){ StackNode * p = S->top; S->top = S->top ->link; free(p); } }
栈的应用举例 数制转换 行编辑程序 迷宫求解 表达式求值
栈的应用举例 ▪ 数制转换 ▪ 行编辑程序 ▪ 迷宫求解 ▪ 表达式求值
数制转换 n=n div d)xd+Nmod d 例如:(1348)10=(2504)8,其运算过程如下: n diy 8 nmod 8 1348168 计算顺序 16821 21 4052 输出顺序
数制转换 N = (N div d)×d + N mod d 例如:(1348)10 = (2504)8 ,其运算过程如下: N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2 输 出 顺 序 计 算 顺 序
void conversion 0 t InitStack(S); scanf(%od" N; while(ni Push(s,n%8) N=N/8 while (stackEmpty(s)i Pop(s, e); printf (od",e); }∥ conversion
void conversion () { InitStack(S); scanf ("%d",N); while (N) { Push(S, N % 8); N = N/8; } while (!StackEmpty(S)) { Pop(S,e); printf ( "%d", e ); } } // conversion
行编辑程序 在用户输入一行的过程中,允许用户输入 出差错,并在发现有误时可以及时更正。 设立一个输入缓冲区,用以接受用户输入 的一行字符,然后逐行存入用户数据区;并假设 #”为退格符,“@”为退行符 假设从终端接受两行字符: whli#ilr#e(s#*s) outcha putchar(s=#++); 实际有效行为: while( s) putchar(s++);
行编辑程序 在用户输入一行的过程中,允许 用户输入 出差错,并在发现有误时可以及时更正。 设立一个输入缓冲区,用以接受用户输入 的一行字符,然后逐行存入用户数据区; 并假设 “#”为退格符,“@”为退行符。 假设从终端接受两行字符: whli##ilr#e(s#*s) outcha@putchar(*s=#++); 实际有效行为: while (*s) putchar(*s++);