//VC++ 6.0编译 #include <stdio.h> #include <stdlib.h> //定义常量 #define STACK_INIT_SIZE 3 //栈的存储空间初始分配量 #define STACKINCREMENT 1 //栈的存储空间增量 #define FALSE 0 //函数执行错误的返回值 #define TRUE 1 //函数执行正确的返回值 //定义元素 #define ElemType int//定义操作对象元素 //栈的结构定义 typedef struct { ElemType *base; ElemType *top; int stacksize; }SqStack; /****************************************函数声明*****************************************/ int InitStack(SqStack*);//构造一个空栈 void DestroyStack(SqStack*);//销毁栈 void ClearStack(SqStack*);//若栈不为空,将栈置空 int StackLength(SqStack);//求栈长 void GetTop(SqStack,ElemType*);//若栈不为空,则用e返回栈顶元素 void Push(SqStack*,ElemType);//插入元素e为新的栈顶元素 void Pop(SqStack*);//若栈不为空,则删除栈顶元素 int StackTraverse();//若栈不为空,则对从栈底到栈顶的元素依次调用Visit()函数。一旦遍历失败,则操作失败。 // //函数功能:创建一个空栈 //初始条件:无 // int InitStack(SqStack *S) { S->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!(*S).base) { printf("overflow!/n"); return FALSE; } S->top=S->base; S->stacksize=STACK_INIT_SIZE; return TRUE; } // //函数功能:销毁栈S //初始条件:栈S存在 // void DestroyStack(SqStack *S) { S->top=NULL; S->stacksize=0; free(S->base); S->base=NULL; } // //函数功能:将栈S置空 //初始条件:栈不为空 // void ClearStack(SqStack *S) { S->top=S->base; } // //函数功能:求栈长 //初始条件:栈S存在 // int StackLength(SqStack S) { return S.top-S.base; } // //函数功能:用e返回栈顶元素 //初始条件:栈S不为空 // void GetTop(SqStack S,ElemType *e) { *e=*(S.top-1); } // //函数功能:插入e为新的栈顶元素 //初始条件:栈S存在 // void Push(SqStack *S,ElemType e) { if(S->top-S->base+1>=S->stacksize) { ElemType *newbase; newbase=(ElemType*)realloc(S->base, (S->stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!newbase) { printf("overflow!/n"); return ; } S->base=newbase; S->top=S->base+S->stacksize-1; S->stacksize+=STACKINCREMENT; } *(S->top)=e; S->top++; } // //函数功能:删除栈顶元素 //初始条件:栈不为空 // void Pop(SqStack *S) { S->top--; } // //函数功能:对从栈底到栈顶的元素 // 依次调用Visit()函数 //初始条件:栈不为空 // //int StackTraverse() /****************************************主函数*******************************************/ void main(void) { //界面设计 printf("*********************************************************/n"); printf("*/t 进制转换器(正十进制转换为二进制)/t/t*/n"); printf("*********************************************************/tby crescents/n/n"); //程序 ElemType e;//声明元素 SqStack S;//声明结构 if(!InitStack(&S))//创建栈 return; A: printf("请输入要转换的十进制数:"); scanf("%d",&e); while(e!=0) { Push(&S,e%2); e=e/2; } printf("/n该数转换为二进制为:"); while(StackLength(S)>0) { GetTop(S,&e); printf("%d",e); Pop(&S); } printf("/n/n**************************/n/n"); goto A; } /* void main(void) { int temp; ElemType e; SqStack S;//声明结构 InitStack(&S);//创建栈 temp=StackLength(S);//求栈长 printf("/n%d/n",temp); scanf("%d",&e); Push(&S,e);//插入e为新的栈顶元素 GetTop(S,&e); printf("/n%d/n",e); ClearStack(&S);//将栈置空 temp=StackLength(S);//求栈长 printf("/n%d/n",temp); DestroyStack(&S);//销毁栈 } */ 栈运用举例: 数制转换、括号匹配检验、行编辑程序、迷宫求解、表达式求值、实现递归......