顺序栈的基本操作及应用程序设计

给出顺序栈的类型定义及其各个操作的算法描述以及代码实现。

代码

#include<iostream>
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
using namespace std;

 
 #define STACK_INIT_SIZE 10
 #define STACKINCREMENT   2
 #define    OK      1
 #define    FALSE 0
 
 typedef int SElemType;
 typedef int Status;
 
 FILE *fp;
 
 typedef struct SqStack
 {
     SElemType *base;
     SElemType *top;
     int     stacksize;
 }SqStack;
 
 Status InitStack(SqStack *S)
 {
     (*S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
     if(!(*S).base)
         exit(OVERFLOW);
     (*S).top = (*S).base;
     (*S).stacksize = STACK_INIT_SIZE;
     return OK;
 }
 
  Status DestroyStack(SqStack *S)
  {
   free((*S).base);
    (*S).base=NULL;
    (*S).top=NULL;
    (*S).stacksize=0;
    return OK;
  }
 
  Status ClearStack(SqStack *S)
  {
    (*S).top=(*S).base;
    return OK;
  }
 
  Status Push(SqStack *S,SElemType e)
  { 
    if((*S).top-(*S).base>=(*S).stacksize) 
    {
    (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
     if(!(*S).base)
        exit(OVERFLOW); 
     (*S).top=(*S).base+(*S).stacksize;
      (*S).stacksize+=STACKINCREMENT;
    }
    *((*S).top)++=e;
    return OK;
  }
 
  Status Pop(SqStack *S,SElemType *e)
   {
     if((*S).top==(*S).base)
       return FALSE;
     *e=*--(*S).top;
     return OK;
   }
  
 
  Status StackTraverse(SqStack S,Status(*visit)(SElemType))
   {
     while(S.top>S.base)
       visit(*S.base++);
     cout<<endl;
     return OK;
   }
 
  Status Copy(SElemType c)
  {
    fputc(c,fp);
    return OK;
   }
 
  void LineEdit()
  {
     SqStack S;
     SElemType ch, c;
     InitStack(&S);
     cout<<"请输入文本, 按trl+Z键结束文本输入:\n";
     ch=getchar();
     while(ch!=EOF)
     { while(ch!=EOF&&ch!='\n')
       {
         switch(ch)
         {
          case '#':   Pop(&S, &c);    break;          
case '@':  ClearStack(&S);   break;           
default :   Push(&S, ch); 
          }
	     ch=getchar();      
}
       StackTraverse(S, Copy); 
       ClearStack(&S); 
       fputc('\n',fp);
       if(ch!=EOF)
       ch=getchar();
     }
    DestroyStack(&S);    
   }
 
void main()
{    fp = fopen("LineEd.txt", "w");
     LineEdit();
     fclose(fp);  
}

测试结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值