【问题标题】:my DeQueue() function is not working properly我的 DeQueue() 函数无法正常工作
【发布时间】:2016-12-05 19:34:53
【问题描述】:

当我运行删除函数时,它给了我一些无限的垃圾值。有什么问题?

#include<iostream>
#include<process.h>
#include<conio.h>
using namespace std;
class circularqueue
{
  int arr[5];
  int front,rear;
  int size;
  int count;
  public:
     circularqueue()
     {
      count = -1;
      front=-1;
      rear=-1;
      size=5;
     }
     void display();
     void enqueue(int val);
     void delete_element();
     bool Is_empty();
};

bool circularqueue::Is_empty(){
    if(front == -1 && rear == -1){
        return true;
    }
    else {
        return false;
    }
 }
void circularqueue :: display()
{
    int F = front;
    for(count; count!=0;count--){
        cout<<"-----------"<<endl;
        cout<<"ID is : "<<arr[F]<<endl;
        cout<<"-----------"<<endl;
        F++;
        if(count == (size-1)){
            F=0;
        } 
        else if(count == -1){
            cout<<"Empty"<<endl;
        }
    }
}

void circularqueue :: enqueue(int val)
{
     if(Is_empty()){
     // cout<<"Queue is empty "<<endl;
        ++front;
        ++rear;
        arr[rear] = val;
     }
     else if(front == 0 and rear == (size-1)){
        cout<<"Queue is Full"<<endl;
     }
     else if(front==0 && rear == 0){
        if(rear<=(size-1)){
            arr[rear]= val;
            rear = rear+1;
        }
     }
     else if(front!=0 && rear == (size-1)){
        rear=0;
        arr[rear]=val;
        rear =rear+1;
     }
     else {
        arr[rear] = val;
        rear=rear+1;
     }
     count++;
}

当我运行此代码时,删除功能无法正常工作,请告诉我修复方法。

它给了我一些垃圾值,它看起来像一个无限循环

void  circularqueue :: delete_element()
{
    if(Is_empty()){
        cout<<"The Queue is empty"<<endl;
    }
    else if(front==(size-1)){
        front = 0;
    }
    else if(front == rear){
        front = -1;
        rear = -1;
    }
    else 
    {
        cout<<"Number Deleted : "<<front<<endl;
        front = front+1;
    }
    count--;
}
int main()
{
    circularqueue obj;

     int num;
     int ch;
     char ch1;
jb:  cout<<" 1 - EnQUEue   2- DeQueue  3- Display"<<endl;
     cin>>ch;
     switch(ch){
        case 1:{
            cout<<"Enter Number : "<<endl;
            cin>>num;
          obj.enqueue(num);
          cout<<"Return to Main Menu: "<<endl;
          cin>>ch1;
          if(ch1=='Y'|| ch1=='y'){
            system("cls");
            goto jb;
           }
            break;
         }
         case 2:{
            obj.delete_element();
             cout<<"Return to Main Menu: "<<endl;
          cin>>ch1;
          if(ch1=='Y'|| ch1=='y'){
            system("cls");
            goto jb;
           }

            break;
         }
         case 3:{
                obj.display();
                 cout<<"Return to Main Menu: "<<endl;
          cin>>ch1;
          if(ch1=='Y'|| ch1=='y'){
            system("cls");
            goto jb;
           }

            break;
         }
         default :{
            cout<<"Invalid entery  "<<endl;
             cout<<"Return to Main Menu: "<<endl;
          cin>>ch1;
          if(ch1=='Y'|| ch1=='y'){
            system("cls");
            goto jb;
           }
            break;
         }
     }
}

【问题讨论】:

  • 你能把问题压缩一点吗?尝试指出您认为代码有什么问题,以便其他人更容易回答
  • 请用Minimal, Complete and Verifiable Example更新您的帖子。
  • 谢谢通知,你只需要关注删除功能我认为有问题
  • 在调试器中运行,你会发现问题不在于delete_element,而在于display
  • 显示功能正常运行。但我曾经调用过删除函数,它开始给我无限的垃圾值

标签: c++ arrays data-structures queue


【解决方案1】:

我已经为您的代码制作了一个更紧凑的版本,它执行相同的任务。看看这是否适合您。

#include<iostream>
using namespace std;

class CircularQueue{
    int arr[10], front, rear, size;
    const int max_size=sizeof(arr)/sizeof(int);
public:
    CircularQueue(){ front = rear = size = 0; }

    bool isEmpty(){ return front==rear; } // or simply size == 0

    bool isFull(){ return (rear+1)%max_size == front; } // or simply size == max_size - 1

    void enQueue(int val){
        if( isFull() ){
            cout << "Queue is Full" << endl;
            return;
        }
        arr[rear] = val;
        rear = (rear+1)%max_size;
        size++;
    }
    int deQueue(){
        if( isEmpty() ){
            cout << "Queue is Empty" << endl;
            return -1;
        }
        int ans = arr[front];
        front = (front+1)%max_size;
        size--;
        return ans;
    }

    void display(){
        if( isEmpty() ){
            cout << "nothing to display" << endl;
            return;
        }
        for( int i=0; i<size; i++ ){
            cout<<"-----------"<<endl;
            cout<<"ID is : "<<arr[(i+front)%max_size]<<endl;
            cout<<"-----------"<<endl;
        }
    }

};

int main(){
    CircularQueue ob;
    bool break_loop=false;
    while( !break_loop ){

        cout << "1 Enqueue, 2 Dequeue, 3 Display 4 Quit \nOption = ";
        int input; cin >> input;
        int tmp;
        switch(input){
            case 1 :
                cout << "Enter number " << endl;
                cin >> tmp;
                ob.enQueue(tmp);
                break;
            case 2 :
                tmp = ob.deQueue();
                if( tmp != -1 ) cout << "Element " << tmp << " deleted" <<endl;
                break;
            case 3 :
                ob.display();
                break;
            case 4 :
                break_loop = true;
                break;
            default :
                break;
        }
    }
    return 0;
}

【讨论】:

  • 我写这个是因为你有不必要的复杂代码,如果对代码有任何疑问,你可以添加评论,我会解释它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 2017-12-15
  • 2013-03-27
  • 2012-08-15
  • 2013-11-05
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多