데이터 구조 요약 - 대기 행렬 과 스 택
1. 대기 열:
template <class T>
class Queue
{
protected:
int front,rear;
T *data;
int maxsize;
public:
Queue ( int sz = 10 ){
rear= front=0;
maxsize=sz;
data=new T[maxsize];
};
~Queue ( ) {
delete [ ] data;
}
void Enq ( T & item );
int Outq( T & item);
void MakeEmpty ( );
int IsEmpty ( );
int IsFull ( );
};
template <class T>
void Queue<T>::Enq( T & item )
{
assert ( !IsFull ( ) ); //
data[ rear] = item; //
rear++;
}
template <class T>
int Queue<T>::Outq( T & item)
{
if ( IsEmpty ( ) ) return 0; //
item=data[front];
front++;
return 1;
}
template <class T>
int Queue<T>::IsEmpty ( )
{
if (front==rear)
{
return 1;
}
else
{
return 0;
}
}
template <class T>
int Queue<T>::IsFull( )
{
if (rear==maxsize)
{
return 1;
}
else
{
return 0;
}
}
template <class T>
void Queue<T>::MakeEmpty()
{
rear=front=0;
}
2. 창고:
class Stack
{
protected:
int top; //
Type *elements; //
int maxSize; //
public:
Stack ( int sz = 10 ); //
~Stack ( ) { delete [ ] elements; }
void Push ( Type & item ); //
int Pop( Type & item); //
Type GetTop ( ); //
void MakeEmpty ( ) { top = -1; } //
int IsEmpty ( ) const { return top == -1; }
int IsFull ( ) const
{ return top == maxSize-1; }
};
template <class Type>
Stack<Type> ::Stack ( int s ) : top (-1), maxSize (s)
{
elements = new Type[maxSize];
assert ( elements != NULL ); //
}
template <class Type>
void Stack<Type> ::Push ( Type & item )
{
assert ( !IsFull ( ) ); //
elements[++top] = item; //
} ;
template <class Type>
int Stack<Type> ::Pop (Type &Item )
{
if ( IsEmpty ( ) ) return 0; //
Item=elements[top];
top--;
return 1; //
}
template <class Type>
Type Stack<Type>::GetTop ( )
{
assert ( !IsEmpty ( ) ); //
return elements[top]; //
}
3. 스 택 의 응용 - 접두사 접 두 사 를 바 꾸 고 계산 합 니 다.
// : , “(” , “)” “(”,
// “(” ,
// 。 ,
// , , , ,
// , 。 。
void operation(char* exp1)//
{
int i=0;
int pos1=0,pos2=0;
char *exp2;
exp2=new char[100];
char temp;
Stack<char> s2(100);//
char first='#';
s2.Push(first);
while(exp1[pos1]!='#')
{
if(judgenum(exp1[pos1]))
{
exp2[pos2]=exp1[pos1];
pos2++;
pos1++;
}
else
{
char sign=judgeop(s2.GetTop(),exp1[pos1]);
switch(sign)
{
case '>':s2.Push(exp1[pos1]),pos1++;break;
case '=':s2.Pop(temp),pos1++;break;
case '<':
{
s2.Pop(temp);
exp2[pos2]=temp;
pos2++;
break;
}
}
}
}
while(s2.Pop(temp))
{
exp2[pos2]=temp;
pos2++;
}
cout<<" :";
while(exp2[i]!='#')
{
cout<<exp2[i]<<" ";
i++;
}
cout<<endl;
cout<<" :";
Result(exp2);
cout<<endl;
delete[]exp2;
}
char judgeop(char o1,char o2)//
{
switch(o1)
{
case '#':return '>';
case '+':{switch(o2)
{
case '*':
case '/':
case '(':return '>';
case '+':
case '-':
case ')':return '<';
}}
case '-':
{
switch(o2)
{
case '*':
case '/':
case '(':return '>';
case '+':
case '-':
case ')':return '<';
}
}
case '*':
{
switch(o2)
{
case '(':return '>';
case '*':
case '/':
case '-':
case '+':
case ')':return '<';
}
}
case '/':
{
switch(o2)
{
case '(':return '>';
case '*':
case '/':
case '+':
case '-':
case ')':return '<';
}
}
case '(':
{
switch(o2)
{
case '+':
case '-':
case '*':
case '/':
case '(':return '>';
case ')':return '=';
}
}
}
}
double operate(double a,double b,char c)//
{
switch(c)
{
case '+':return (a+b);
case '-':return (a-b);
case '*':return (a*b);
case '/':return (a/b);
}
}
// , , ,
// ,,,,
void Result(char *exp1)//
{
Stack<double> s1(100);
int pos=0;
double temp1,temp2;
double result=0;
while(exp1[pos]!='#')
{
if (exp1[pos]>=48&&exp1[pos]<=57)
{
double d=(double)(exp1[pos]-48);
s1.Push(d);
pos++;
}
else
{
s1.Pop(temp1);
s1.Pop(temp2);
result=operate(temp2,temp1,exp1[pos]);
s1.Push(result);
pos++;
}
}
s1.Pop(result);
cout<<result<<endl;
}
4. 대기 열의 응용:
// : ,
void divisition(int r[9][9],int n)
{
int *q,*temp,*s;
q=new int[n];
temp=new int[n];
s=new int[n];
Queue<int> que(20);
int set=0,i,k,per=1;
for (k=1;k<=n;k++)//
{
que.Enq(k);
}
do
{
que.Outq(i);
if (i<=per)// ,
{
set++;//
s[i]=set;
for(k=1;k<=n;k++)
temp[k]=r[i][k];
per=i;
}
else
{
if (temp[i]!=0)// , ,
{
que.Enq(i);
}
else
{
s[i]=set;// ,
for (k=i+1;k<=n;k++)
{
temp[k]=temp[k]+r[i][k];//
}
}
per=i;// ,
}
} while (!que.IsEmpty());
cout<<" :";
for(int i=1;i<=9;i++)
cout<<i<<" ";
cout<<endl;
cout<<" :";
for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
delete []q;
delete []s;
delete []temp;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.