在用堆栈写行编辑程序时遇到的棘手问题,大家来帮帮忙啊!!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef char datatype;
typedef struct st
{
datatype *top; //栈顶指针
datatype *base; //栈尾指针
int stacksize; //堆栈大小
} STACK;
void InitStack(STACK &s) //初始化堆栈
{
s.base=(datatype *)malloc(sizeof(datatype)*STACK_INIT_SIZE);
if (!s.base) exit(0);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}
void push(STACK &s,datatype e) //压栈
{
if (s.top - s.base > s.stacksize){
s.base=(datatype *)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(datatype));
if (!s.base) exit (0);
s.top=s.base+s.stacksize;
s.stacksize+=STACK_INCREMENT;
}
*s.top++=e;
}
void clearstack(STACK &s) //清空堆栈
{
s.top=s.base;
}
datatype pop(STACK &s) //出栈
{
if (s.top==s.base) return 0;
return *--s.top;
}
void main()
{
STACK s;
char b[100],*p=b,c;
InitStack(s);
printf ("请输入字符串\(以\".\"\)结束:\n");
scanf ("%[^.]",b); //接收字符串
//c=0;
//while(c<strlen(b)+1) printf ("%d ",b[c++]);
while (*p!='.') //处理字符串
{
// printf ("*p=%c ",*p);
switch(*p) //根据不同情况处理
{
case '#':
pop(s);
break;
case '@': ///问题行
//printf ("%c",*p);
while (pop(s)!=10);
push(s,10);
break;
default:
push(s,*p);
}
p++;
}
p=s.base;
printf ("\n处理后的字符串为:\n%s\n",p); //显示处理后的字符串
}
题目要求是:遇到"#",则删除前一字符,遇到"@",删除整行,以"."表示字符串结束
例如用户输入
hello!wwww###elcome
Enjoy your time !@aaaaa
gogogo.
则经过程序处理后应输出
hello!welcome
aaaaa
gogogo
现在,我遇到了棘手问题.
当问题行为"@"时,程序能正确处理"#",也能正确处理"@",但最后一行不显示。
例如上述的处理后的结果为:
hello!welcome
aaaaa
-----------------------------上边是空行
如果问题行改为"&"时,程序一切正常,输出结果正确。
请高手帮忙!!!!!