云中烛火

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1. 栈的基本操作
      1 #include<string.h>
      2 #include<ctype.h>
      3 #include<malloc.h>
      4 #include<limits.h>
      5 #include<stdio.h>
      6 #include<stdlib.h>
      7 #include<math.h>
      8 
      9 #define TRUE 1
     10 #define FALSE 0
     11 #define OK 1
     12 #define ERROR 0
     13 #define INFEASIBLE -1
     14 
     15 typedef int Status;
     16 typedef int Boolean;
     17 typedef int SElemType;
     18 
     19 #define STACK_INIT_SIZE 10
     20 #define STACKINCREMENT 2
     21 typedef struct SqStack{
     22     SElemType *base;
     23     SElemType *top;
     24     int stacksize;
     25 }SqStack;
     26 
     27 
     28 
     29 Status InitStack(SqStack *S){
     30     //构造一个空栈S
     31     (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
     32     if(!(*S).base)
     33         exit(OVERFLOW);
     34     (*S).top=(*S).base;
     35     (*S).stacksize=STACK_INIT_SIZE;
     36     return OK;
     37 }
     38 
     39 Status DestroyStack(SqStack *S){
     40     //销毁栈S,S不再存在
     41     free((*S).base);
     42     (*S).base=NULL;
     43     (*S).top=NULL;
     44     (*S).stacksize=0;
     45     return OK;
     46 }
     47 
     48 
     49 Status ClearStack(SqStack *S){
     50     //把S置为空栈
     51     (*S).top=(*S).base;
     52     return OK;
     53 }
     54 
     55 Status StackEmpty(SqStack S){
     56     //若栈S为空栈,则返回TRUE,否则返回FALSE
     57     if(S.top==S.base)
     58         return TRUE;
     59     else
     60         return FALSE;
     61 }
     62 
     63 
     64 int StackLength(SqStack S){
     65     //返回栈中元素的个数,及即栈的长度
     66     return S.top-S.base;
     67 }
     68 
     69 Status GetTop(SqStack S,SElemType *e){
     70     //若栈不空,则用e返回栈顶预案素,并返回OK ,否则返回ERROR
     71     if(S.top>S.base){
     72         *e=*(S.top-1);
     73         return OK;
     74     }
     75     else
     76         return ERROR;
     77 }
     78 
     79 Status Push(SqStack *S,SElemType e){
     80     //插入元素e为新的栈顶元素
     81     if((*S).top-(*S).base>=(*S).stacksize){
     82         (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
     83         if(!(*S).base)
     84             exit(OVERFLOW);
     85         (*S).top=(*S).base+(*S).stacksize;
     86         (*S).stacksize+=STACKINCREMENT;
     87     }
     88     *((*S).top)++=e;
     89     return OK;
     90 }
     91 
     92 Status Pop(SqStack *S,SElemType *e){
     93     //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR;
     94     if((*S).top==(*S).base)
     95         return ERROR;
     96     *e=*--(*S).top;
     97     return OK;
     98 }
     99 
    100 Status StackTraverse(SqStack S,Status (*visit)(SElemType)){
    101     //从栈底到栈顶一次对栈中的每个元素调用函数visit().一旦visit()失败,则操作失败
    102     while(S.top>S.base)
    103         visit(*S.base++);
    104     printf("\n");
    105     return OK;
    106 }
    View Code

     

  2. 进制转换
     1 void conversion(){
     2     //对于输入的任意一个非负十进制整数,打印输出与其相等的八进制数
     3     SqStack s;
     4     unsigned n;
     5     SElemType e;
     6     InitStack(&s);
     7     printf("n(>=0)=");
     8     scanf("%u",&n);
     9     while(n){
    10         Push(&s,n%8);
    11         n=n/8;
    12     }
    13     while(!StackEmpty(s)){
    14         Pop(&s,&e);
    15         printf("%d",e);
    16     }
    17     printf("\n");
    18 }
    19 
    20 void main(){
    21     conversion();
    22 }
    View Code

     

  3. 括号匹配问题
     1 void check(){//运行程序时:要把typedef int SElemType;换成typedef char SElemType;
     2     //对于输入的任意一个字符串,检验括号是否匹配
     3     SqStack s;
     4     SElemType ch[80],*p,e;
     5     if(InitStack(&s)){
     6         printf("请输入表达式\n");
     7         gets(ch);
     8         p=ch;
     9         while(*p)
    10             switch(*p){
    11                 case '(':
    12                 case '[':Push(&s,*p++);
    13                     break;
    14                 case ')':
    15                 case ']':
    16                     if(!StackEmpty(s)){
    17                         Pop(&s,&e);
    18                         if(*p==')'&&e!='('||*p==']'&&e!='['){
    19                             printf("左右括号不匹配\n");
    20                             exit(ERROR);
    21                         }
    22                         else{
    23                             p++;
    24                             break;
    25                         }
    26                     }
    27                     else{//只输入右括号时
    28                         printf("缺乏左括号\n");
    29                         exit(ERROR);
    30                     }
    31                 default:p++;
    32             }
    33             if(StackEmpty(s))
    34                 printf("括号匹配\n");
    35             else
    36                 printf("缺乏右括号\n");
    37     }
    38 }
    39 
    40 void main(){
    41     check();
    42 }
    View Code

     

posted on 2013-11-13 13:15  云中烛火  阅读(168)  评论(0)    收藏  举报