追忆~似水年华
2019-08-05 18:16
采纳率: 48%
浏览 303

为什么键盘输入字符串和文件导入字符串都有错?错误应该怎么改?

#include <iostream.h>
#include <windows.h>
#include <string>
#include<fstream>

using namespace std;

class Stack;//类Stack的声明

/*
定义一个链栈结点类Stacknode
*/
class Stacknode
{
    friend class Stack;//申请友元类
private:
    Stacknode(Stacknode *nextp=NULL);//构造函数
    Stacknode(char &newdata,Stacknode *nextp=NULL);//构造函数
    int data;//数据元素
    Stacknode *next;//递归定义指向后继结点的指针
};

/*
Stacknode的实现部分
*/
Stacknode::Stacknode(Stacknode *nextp)//构造函数
{
    next=nextp;
}

Stacknode::Stacknode(char &newdata,Stacknode *nextp)//构造函数
{
    data=newdata;
    next=nextp;
}
//结点类Stacknode的定义结束

/*
定义一个链栈类Stack
*/
class Stack
{
public:
    Stack();//创建一个空栈
    ~Stack();//回收一个栈
    void clear();//销毁一个栈
    bool empty() const;//确定栈是否已空
    bool push(char &item);//把数据压进栈
    bool pop();//出栈
    bool pop(char &item);//把数据弹出栈,返回
    bool top(char &item) const;//取出栈顶元素
private:
    Stacknode *newnode(Stacknode *nextp=NULL);
    Stacknode *newnode(char &item,Stacknode *nextp=NULL);//创建新的结点
    Stacknode *Stacktop;
    int Stacklength;
};

/*
Stack的实现部分
*/
Stacknode *Stack::newnode(Stacknode *nextp)//创建新的结点,不带数据
{
    return new Stacknode(nextp);
}

Stacknode *Stack::newnode(char &item,Stacknode *nextp)//创建新的结点,数据域赋值
{
    return new Stacknode(item,nextp);
}

//以下为栈类Stack的函数定义
Stack::Stack()//创建一个空栈
{
    Stacktop=newnode();//创建一个栈顶指针初始化,相当于Stacktop=NULL;本链表没有用头结点
    Stacklength=0;
}

Stack::~Stack()//回收一个栈
{
    clear();
    delete Stacktop;//释放栈底
}

void Stack::clear()//销毁一个栈
{
    while(pop());//不停地出栈,而每次释放空间在出栈函数中完成
}

bool Stack::empty() const//确定栈是否已空
{
    return Stacklength<=0?true:false;
}

bool Stack::push(char &item)//数据进栈
{
    Stacknode *newnodep;//定义指针newnodep,准备指向申请的新结点
    newnodep=newnode(item,Stacktop);//申请新结点,把数据存入,把指针域指向头指针
    if(!newnodep)//如果没有申请到空间,返回失败
        return false;
    Stacktop=newnodep;//改链,完成进栈
    Stacklength++;//栈的长度增加
    return true;//本次操作成功
}

bool Stack::pop()//出栈,不要栈顶数据
{
    Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点
    if(!empty())//判断是否栈空
    {
        usednodep=Stacktop;//指向出栈的结点
        Stacktop=Stacktop->next;//栈顶指针后移
        delete usednodep;//释放空间
        Stacklength--;//栈的长度减少
        return true;//本次操作成功
    }
    return false;//否则本次操作失败
}

bool Stack::pop(char &item)//出栈,把栈顶数据弹返回去
{
    Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点
    if(!empty())//判断是否栈空
    {
        usednodep=Stacktop;//指向出栈的结点
        Stacktop=Stacktop->next;//栈顶指针后移
        item=usednodep->data;//把数据保留下来,返回去
        delete usednodep;//释放空间
        Stacklength--;//栈的长度减少
        return true;//本次操作成功
    }
    return false;//否则本次操作失败
}

bool Stack::top(char &item) const//取出栈顶数据返回去
{
    if(!empty())//如果栈不空,记录当前栈顶元素
    {
        item=Stacktop->data;//通过item返回去
        return true;//本次操作成功
    }
    return false;//否则本次操作失败
}

/*
定义一个功能类SymbolMatching
*/
class SymbolMatching
{
private:
    Stack *stack;
public:
    SymbolMatching();//构造函数
    ~SymbolMatching();//析构函数
    bool manualinputdatabase(char *database);//人工输入数据信息
    bool fileguidedatabase(char *filename);//文件导入数据信息
};

SymbolMatching::SymbolMatching()//构造函数
{
    stack=new Stack;
}

SymbolMatching::~SymbolMatching()//析构函数
{
    delete stack;
}

bool SymbolMatching::manualinputdatabase(char *database)//人工输入数据信息
{
    int i=0;
    char match,symbol;
    bool is_match=true;
    while(database[i]!='\0'&&is_match)
    {
        symbol=database[i++];
        if(symbol=='('||symbol=='{'||symbol=='[')
            stack->push(symbol);//入栈
        else if(symbol==')'||symbol=='}'||symbol==']')
        {
            if(stack->empty())
            {
                if(database[i+1]!='\0')
                    cout<<"右边符号多于左边符号!"<<endl;
                else
                    cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl;
                is_match=false;
            }
            else
            {
                stack->top(match);
                stack->pop();//出栈
                is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{');
                if(!is_match)
                    cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl;
            }
        }
    }
    if(is_match)
    {
        if(!stack->empty())//栈不为空
        {
            cout<<"左边符号多于右边符号!"<<endl;
            is_match=false;
        }
        else
            cout<<"左右符号匹配次序正确!"<<endl;
    }
    stack->clear();
    return is_match;
}

bool SymbolMatching::fileguidedatabase(char *filename)//文件导入数据信息
{
    int i=0;
    char match,symbol;
    bool is_match=true;
    while(filename[i]!='\0'&&is_match)
    {
        symbol=filename[i++];
        if(symbol=='('||symbol=='{'||symbol=='[')
            stack->push(symbol);//入栈
        else if(symbol==')'||symbol=='}'||symbol==']')
        {
            if(stack->empty())
            {
                if(filename[i+1]!='\0')
                    cout<<"右边符号多于左边符号!"<<endl;
                else
                    cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl;
                is_match=false;
            }
            else
            {
                stack->top(match);
                stack->pop();//出栈
                is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{');
                if(!is_match)
                    cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl;
            }
        }
    }
    if(is_match)
    {
        if(!stack->empty())//栈不为空
        {
            cout<<"左边符号多于右边符号!"<<endl;
            is_match=false;
        }
        else
            cout<<"左右符号匹配次序正确!"<<endl;
    }
    stack->clear();
    return is_match;
}

/*
定义一个实现链栈功能的菜单处理类interfacebase
*/
class interfacebase
{
private:
    SymbolMatching SymbolMatchingonface;
public:
    void clearscreen(void);//清屏
    void showmenu(void);//显示菜单函数
    int userchoice(void);//用户的选项
    void processmenu(int menuchoice);//菜单函数
};

/*
interfacebase类的实现部分
*/
void interfacebase::clearscreen(void)
{
    system("cls");
}

void interfacebase::showmenu(void)
{
    cout<<"链式堆栈实现括号匹配判断的功能菜单"<<endl;
    cout<<"=================================="<<endl;
    cout<<"1.人工输入数据信息"<<endl;
    cout<<"2.文件导入数据信息"<<endl;
    cout<<"0.退出"<<endl;
    cout<<"=================================="<<endl;
}

int interfacebase::userchoice(void)
{
    int menuchoice;
    cout<<"请输入您的选择:";
    cin>>menuchoice;
    return menuchoice;
}

void interfacebase::processmenu(int menuchoice)
{
    switch(menuchoice)//根据用户的选择进行相应的操作
    {
    case 1:
        {
            string str;
            char temp;
            cout<<"输入字符串,按回车键结束输入:"<<endl;
            while((temp=cin.get())!='\n')
            {
                str +=temp;
            }
            const int LEN =str.length();
            char* database = new char[LEN];//根据输入字符串的长度,创建字符数组
            for(int i = 0;i<LEN;i++) //将字符串保存到字符数组中
            {
                database[i]=str[i];
            }
            SymbolMatchingonface.manualinputdatabase(database);
            delete database;
        }
        break;
    case 2:
        {
            ifstream in("data.txt");
            char data,j,*filename=new char[100];
            int num=0;
            while(!in.eof())
            {
                in>>data;
                filename[num]=data;
                cout<<filename[num];
                num++;
            }
            cout<<endl;
            SymbolMatchingonface.fileguidedatabase(filename);
            delete filename;
        }
        break;
    case 0:
        exit(0);
    default:
        cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
        break;
    }
}

/*
程序主入口
*/
void main(void)
{
    int menuchoice;//定义变量,菜单选单项的选择
    interfacebase interfacebasenow;
    system("color f0");//修改屏幕的背景色和字的颜色
    interfacebasenow.clearscreen();//清屏
    while(1)//永真循环
    {
        interfacebasenow.showmenu();//显示菜单
        menuchoice=interfacebasenow.userchoice();//获取用户的选择
        interfacebasenow.processmenu(menuchoice);//处理用户的选择
        system("pause");
        interfacebasenow.clearscreen();//清屏
    }
}//主函数结束

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • Rotch 2019-08-06 11:41
    已采纳

    第一个

    While(1) {
     char tmp = cin.get();
     if (tmp == '\r' /*Aka '\n'*/) {
         break;
        }
        else {
            str += tmp;
        }
    }
    
    

    第二个
    如果你要获取整个TXT内的所有内容,可以这样:

    string str, tmp;
    while (getline(in, tmp) {
        str += tmp;
    }
    

    如果不行的话再问吧,我也不太搞控制台这边,但希望采纳一下,谢谢!

    已采纳该答案
    打赏 评论

相关推荐 更多相似问题