自己寫完運行和輸出結果一模一樣 但是OJ一直不給過 求求各位大神幫忙看看出現了什么問題
以下是 佇列 的幾個命令以及其含義:
INIT 初始化佇列
PRINT 輸出一行:從頭到尾輸出佇列每一個元素。元素之間用一個空格分隔
ENTER value value進隊
OUT 如果佇列不空,則隊首元素出隊。如果佇列是空的,則不做任何動作。
LENGTH 輸出當前佇列的元素個數
佇列的每個元素都是字符型的。
Input
測驗用例的第一行是一個整數 n ( 0 < n < 10000 ) ,表示這個測驗用例有多少條命令。
接下來是n行,每行是一條命令。按順序從頭到尾執行每一條命令。
Output
對其中的PRINT和LENGTH命令,輸出相應資訊。
Sample Input
11
INIT
ENTER E
ENTER 5
ENTER t
LENGTH
ENTER 8
ENTER A
OUT
LENGTH
Sample Output
3
E 5 t 8 A
4
5 t 8 A
以下是我的代碼:
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include<string.h>
#include<fstream>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char QElemType;
typedef struct
{
QElemType *base;//存盤空間基地址
int front;//頭指標
int rear;//尾指標
}SqQueue;
int INIT(SqQueue &Q)
{
Q.base=(QElemType*)malloc(10000*sizeof(QElemType));
if(!Q.base) exit(0);
Q.front=Q.rear=0;
return OK;
}
int PRINT(SqQueue &Q)
{
for(int i=Q.front;i<Q.rear;i++)
{
printf("%c ",Q.base[i]);
}
printf("\n");
return OK;
}
int ENTER(SqQueue &Q,char value)
{
Q.base[Q.rear]=value;
Q.rear++;
return OK;
}
int OUT(SqQueue &Q,char &value)
{
if(Q.front==Q.rear) return 0;
value=https://bbs.csdn.net/topics/Q.base[Q.front];
Q.front=Q.front+1;
return OK;
}
int LENGTH(SqQueue &Q)
{
return Q.rear-Q.front;
}
int main(){
SqQueue Q;
int i=0;
char value;
int choice;
char s[10];
scanf("%d",&choice);
while(i<choice)
{
scanf("%s",s);
if(strcmp("INIT",s)==0) INIT(Q);
else if(strcmp("ENTER",s)==0)
{
scanf("%s",&value);
ENTER(Q,value);
}
else if(strcmp("PRINT",s)==0) PRINT(Q);
else if(strcmp("LENGTH",s)==0) printf("%d\n",LENGTH(Q));
else if(strcmp("OUT",s)==0) OUT(Q,value);
i++;
}
free(Q.base);
return 0; }
uj5u.com熱心網友回復:
例外考慮不完善,你要把佇列當一個環來處理。假設塞滿10000資料,彈出一個,再塞入一個,你的rear++不就越界了嗎?
所以各個函式都要考慮求余,考慮rear反轉的情況!
uj5u.com熱心網友回復:
那請問我得用什么辦法解決比較合適,我對這方面也是剛在學,謝謝你的回答。
uj5u.com熱心網友回復:
1. 最好記錄下佇列中元素數目,防止front'/rear重疊后不知道是空佇列還是滿佇列2. 函式中front/rear在++后對10000求余
3. print函式考慮rear小于front的場景(要么分兩段列印,要么同樣對10000求余就行,只是回圈條件寫清楚,最好寫成從0到佇列數目。
以上改動主要就是加個求余,以實作“環形”佇列操作
uj5u.com熱心網友回復:
好的 十分感謝uj5u.com熱心網友回復:
能再幫我看看代碼嗎 我看了你的建議修改了但是OJ還是不給通過 實在是不知道怎么辦
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10020
typedef char QElemType;
typedef struct
{
QElemType *base;//存盤空間基地址
int front;//頭指標
int rear;//尾指標
}SqQueue;
int INIT(SqQueue &Q)
{
Q.base=new QElemType[MAXSIZE];
if(!Q.base) exit(OVERFLOW);
Q.front=Q.rear=0;
return OK;
}
int PRINT(SqQueue &Q)
{
if(Q.front>=Q.rear%MAXSIZE) return ERROR;
else{
for(int i=Q.front;i<Q.rear;i++)
{
printf("%c ",Q.base[i]);
}
printf("\n");
return OK;}
}
int ENTER(SqQueue &Q,char value)
{
if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;
Q.base[Q.rear]=value;
Q.rear=(Q.rear+1)%MAXSIZE;
return OK;
}
int OUT(SqQueue &Q,char &value)
{
if(Q.front==Q.rear%MAXSIZE) return ERROR;
else{
value=https://bbs.csdn.net/topics/Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return OK;}
}
int LENGTH(SqQueue &Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
int main(){
SqQueue Q;
int i=0;
char value;
int choice;
char s[10000],ch;
scanf("%d",&choice);
while(i<choice)
{
scanf("%s",s);
if(strcmp("INIT",s)==0) INIT(Q);
else if(strcmp("ENTER",s)==0)
{
scanf("%s",&value);
ENTER(Q,value);
}
else if(strcmp("LENGTH",s)==0) printf("%d\n",LENGTH(Q));
else if(strcmp("PRINT",s)==0) PRINT(Q);
else if(strcmp("OUT",s)==0) OUT(Q,value);
i++;
}
return 0; }
uj5u.com熱心網友回復:
你想復雜了呀,舉個函式修改例子(建議參考你初始代碼)int ENTER(SqQueue &Q,char value)
{
Q.base[Q.rear++]=value;
Q.rear %= 10000;
return OK;
}
uj5u.com熱心網友回復:
建議增加元素計數,否則不好判佇列空和佇列滿int ENTER(SqQueue &Q,char value)
{
if (QueCnt >= 10000)
return;
Q.base[Q.rear++]=value;
Q.rear %= 10000;
QueCnt++;
return OK;
}
uj5u.com熱心網友回復:
int PRINT(SqQueue &Q){
int index = Q.front;
for(int i=0; i<QueCnt; i++)
{
printf("%c ",Q.base[index++]);
index %= 10000;
}
printf("\n");
return OK;
}
uj5u.com熱心網友回復:
[color=#FFFF00]