题目:

栈大法好!
思路:
每一行存入输出数组前先推入栈中暂存
检查输入字符是否为 ‘#‘ 如果是就弹出栈顶元素
检查输入字符是否为 ‘@‘ 如果是就清空栈
发现用户键入回车就将当前栈中的字符从栈尾到栈顶 推到输出数组
重复上述操作直到用户输入 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