0
点赞
收藏
分享

微信扫一扫

行编辑程序(数据结构c语言版49页)

扬帆远航_df7c 2022-02-26 阅读 57

         采用c++stl实现,本题难点不多,思路也不怎么复杂。鄙人一开始写的时候就是出于使用栈来实现并且不自己构建栈,在网上搜索了一大圈没有找到用容器写的,大多数都是手动建栈。所以自己斗胆采用c++的STL容器里面栈来实现。漏洞很多最令我头痛的是输出数据时必须倒序输出我用for循环输出实现不了,尝试了很多遍,在函数里我给他注释了起来,自己用while循环输出的数据

题目

一个简单的行编辑程序的功能是:接受用户从终端输人的程序或数据,并存人用户的数据区。由于用户在终端上进行输人时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的。较好的做法是,设立一个输人缓冲区,用以接受用户输人的一行字符,然后逐行存人用户数据区。允许用户输人出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键人的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键人的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。例如,假设从终端接
 

下面是测试输入数据

whli##ilr#e(s#*s)
    outcha@putchar(*s=#++)

正确输出

while(*s)
    putchar(*s++)

源代码如下:

#include<cstdio>
#include<string>
#include<string.h>
#include<stack>                //c++STL栈的头文件
#include<iostream> 
#include<stdlib.h>
using namespace std;

stack<char> s;//定义一个字符型的栈

void LineEdit(string str)
{
    int count=0,len;
    char v[100];
    for(int i=0;i<str.length();i++)
        {
            char b;
            char a=str[i];
            //s.push(a);
            if(!s.empty()&&(a=='#'||a=='@')){
                if(a=='@'){
                    while(!s.empty()){
                        s.pop();
                    }
                }
                else s.pop();             
                
            }
            else {
                
                s.push(a);
            }
            
        }
            while(!s.empty()){
                v[count++]=s.top();
                s.pop();
            }
            len=strlen(v);
            while(len){
                printf("%c",v[len]);
                len--;
            }
            printf("%c\n",v[0]);
            /*
            for(;len<=0;len--)
            {
                printf("%c",v[len]);    
            }
            */
 } 
 
 int main(){
     int count=0,len=0,k=0;
    char v[100];
    string str1,str2;
    cin>>str1;
    cin>>str2;
    LineEdit(str1);
    LineEdit(str2);
    return 0;
 }

举报

相关推荐

0 条评论