1. C/C++

行编辑程序 [栈实现]

题目:

栈大法好!

思路:

每一行存入输出数组前先推入栈中暂存

检查输入字符是否为 ‘#‘ 如果是就弹出栈顶元素

检查输入字符是否为 ‘@‘ 如果是就清空栈

发现用户键入回车就将当前栈中的字符从栈尾到栈顶 推到输出数组

重复上述操作直到用户输入 EOF

 

 代码如下:


/************************
 *Stack application [行编辑程序]
 *SENCOM LAB
 *Michael Jiang
 *2018-9-19
 ************************/
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define ElemType char //这里直接根据需求改数据类型
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
#include "stdio.h"
#include "stdlib.h"

typedef struct {
  ElemType *base;
  ElemType *top;
  int stacksize;
}SqStack;

//active funtion
int InitStack(SqStack &s)
{
  s.base = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
  if(!s.base) return ERROR;
  s.top = s.base;
  s.stacksize = STACK_INIT_SIZE;
  return OK;
}
int DestroyStack(SqStack &s)
{
  free(s.base);
  return OK;
}
int ClearStack(SqStack &s)
{
  s.top = s.base;
  return OK;
}
ElemType GetTop(SqStack &s)
{
  ElemType e;
  if(s.top == s.base) return ERROR;
  e = *(s.top-1);
  return e;
}
int Push(SqStack &s,ElemType e)
{
  if(s.top - s.base >= s.stacksize) {
  s.base = (ElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(ElemType));
  if(!s.base)exit(-1);
  s.top = s.base + s.stacksize;
  s.stacksize += STACKINCREMENT;
  }
  *s.top = e;
  s.top++;
  return OK;
}
int Pop(SqStack &s)
{
  if(s.top == s.base) return ERROR;
  s.top--;
  return OK;
}

//Static funtion
int StackEmpty(SqStack s)
{
  if(s.top == s.base)
    return TRUE;
  else
    return FALSE;
}
int StackTravel(SqStack s)
{
  ElemType *p = s.top;
  printf("top->");
  for(p--;p >= s.base ; p--){
    printf("%c->",*p);
  }
  printf("base\n");
  return OK;
}

//main funtion
int main(int argc, char const *argv[]) {
  /* code */
  SqStack s;
  int i = 0;
  char ch;
  char out[128];
  char *p;
  if(!InitStack(s))exit(-1);
  p = s.base;//p 指针指向栈底
  ch = getchar();
  while(ch != EOF){
    while (ch != EOF && ch != '\n') {//单行
      switch (ch) {
        case '#' : Pop(s);break;
        case '@' : ClearStack(s);break;
        default : Push(s,ch);break;
      }
      ch = getchar();
    }
    while (p != s.top ) {//把从栈底到栈顶的字符写到 out[]
      out[i++] = *p;
      p++;
    }
    out[i++]='\n';//把回车写入 out[]
    p = s.base;//p 指针归位
    ClearStack(s);//清空栈
    if(ch != EOF ) ch = getchar();// 接收下一个字符
  }
  out[i] = '\0';
  puts(out);//输出 out[]
  return 0;
}

执行效果如下:

END