四,顺序栈和顺序队列
(1)顺序栈的应用(十进制数转换为二进制数)
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define max 100
#define N 2
typedef struct
{
ElemType data[ max] ;
int top;
} sqstack;
sqstack * s;
void initstack ( sqstack * & s)
{
s= ( sqstack * ) malloc ( sizeof ( sqstack) ) ;
s-> top= - 1 ;
}
bool push ( sqstack * & s, ElemType e)
{
if ( s-> top== max- 1 )
return false;
s-> top++ ;
s-> data[ s-> top] = e;
return true;
}
bool pop ( sqstack * & s, ElemType & e)
{
if ( s-> top== - 1 )
return false;
e= s-> data[ s-> top] ;
s-> top-- ;
printf ( "%d" , e) ;
return true;
}
void dub ( int x)
{
int m, n, y;
while ( x> 0 )
{
m= x% N;
x= x/ N;
push ( s, m) ;
}
while ( s-> top!= - 1 )
{
pop ( s, n) ;
}
}
int main ( )
{
int x;
initstack ( s) ;
printf ( "请输入一个十进制数\n" ) ;
scanf ( "%d" , & x) ;
dub ( x) ;
printf ( "\n" ) ;
system ( "pause" ) ;
return 0 ;
}
(2)顺序队列的应用
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define max 100
typedef struct
{
ElemType data[ max] ;
int front, rear;
} squeue;
squeue * q;
void initqueue ( squeue * & q)
{
q= ( squeue * ) malloc ( sizeof ( squeue) ) ;
q-> front= q-> rear= - 1 ;
}
bool queueempty ( squeue * q)
{
return ( q-> front== q-> rear) ;
}
bool enqueue ( squeue * & q, ElemType e)
{
if ( q-> rear== max- 1 )
return false;
q-> rear++ ;
q-> data[ q-> rear] = e;
return true;
}
bool dequeue ( squeue * & q, ElemType & e)
{
if ( q-> front== q-> rear)
return false;
q-> front++ ;
e= q-> data[ q-> front] ;
return true;
}
void paidui ( int x)
{
int i, n;
printf ( "原始数据为:\n" ) ;
for ( i= 1 ; i<= x; i++ )
{
enqueue ( q, i) ;
dequeue ( q, n) ;
printf ( "%d " , n) ;
}
printf ( "\n出队顺序:\n" ) ;
for ( i= 1 ; i<= x; i++ )
{
enqueue ( q, i) ;
}
while ( queueempty ( q) != true)
{
dequeue ( q, n) ;
printf ( "%d " , n) ;
if ( queueempty ( q) != true)
{
dequeue ( q, n) ;
enqueue ( q, n) ;
}
}
}
int main ( )
{
initqueue ( q) ;
int x;
printf ( "请输入数字:\n" ) ;
scanf ( "%d" , & x) ;
paidui ( x) ;
printf ( "\n" ) ;
system ( "pause" ) ;
return 0 ;
}
五,实现链栈的基本运算的算法
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct linknode
{
ElemType data;
struct linknode * next;
} LinkStNode;
void initlist ( LinkStNode * & s)
{
s = ( LinkStNode * ) malloc ( sizeof ( LinkStNode) ) ;
s-> next = NULL ;
}
void destorylist ( LinkStNode * & s)
{
LinkStNode * pre = s, * p = s-> next;
while ( p != NULL )
{
free ( pre) ;
pre = p;
p = pre-> next;
}
free ( pre) ;
}
bool stackempty ( LinkStNode * s)
{
return ( s-> next == NULL ) ;
}
void push ( LinkStNode * & s, ElemType m)
{
LinkStNode * p;
p = ( LinkStNode * ) malloc ( sizeof ( LinkStNode) ) ;
p-> data = m;
p-> next = s-> next;
s-> next = p;
printf ( "%d\n" , s-> next-> data ) ;
}
bool pop ( LinkStNode * & s, ElemType & m)
{
LinkStNode * p;
if ( s-> next == NULL )
{
return false;
}
p = s-> next;
m = p-> data;
s-> next = p-> next;
free ( p) ;
return true;
}
bool gettop ( LinkStNode * s, ElemType & m)
{
if ( s-> next == NULL )
{
return false;
}
m = s-> next-> data;
return true;
}
int main ( )
{
LinkStNode * p;
ElemType n;
initlist ( p) ;
printf ( "入栈后为:\n" ) ;
push ( p, 10 ) ;
push ( p, 20 ) ;
push ( p, 30 ) ;
push ( p, 40 ) ;
push ( p, 50 ) ;
printf ( "\n出栈后为:\n" ) ;
pop ( p, n) ;
printf ( "%d\n" , n) ;
pop ( p, n) ;
printf ( "%d\n" , n) ;
pop ( p, n) ;
printf ( "%d\n" , n) ;
pop ( p, n) ;
printf ( "%d\n" , n) ;
pop ( p, n) ;
printf ( "%d\n" , n) ;
system ( "pause" ) ;
return 0 ;
}
六,实现链队的基本运算的算法
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct qnode
{
ElemType data;
struct qnode * next;
} DataNode;
typedef struct queue
{
DataNode * front;
DataNode * rear;
} Linkqueue;
void initqueue ( Linkqueue * & s)
{
s = ( Linkqueue * ) malloc ( sizeof ( Linkqueue) ) ;
s-> front = s-> rear = NULL ;
}
void Destoryqueue ( Linkqueue * & s)
{
DataNode * pre = s-> front, * p;
if ( pre != NULL )
{
p = pre-> next;
while ( p != NULL )
{
free ( pre) ;
pre = p;
p = p-> next;
}
free ( pre) ;
}
free ( s) ;
}
bool Queueempty ( Linkqueue * & s)
{
return ( s-> rear == s-> front) ;
}
void enqueue ( Linkqueue * & s, ElemType e)
{
DataNode * p;
p = ( DataNode * ) malloc ( sizeof ( DataNode) ) ;
p-> data = e;
p-> next = NULL ;
if ( s-> rear == NULL )
{
s-> front = s-> rear = p;
}
else
{
s-> rear-> next = p;
s-> rear = p;
}
}
bool dequeue ( Linkqueue * & s, ElemType & e)
{
DataNode * t;
if ( s-> rear == NULL )
return false;
t = s-> front;
if ( s-> front == s-> rear)
s-> front = s-> rear = NULL ;
else
s-> front = s-> front-> next;
e = t-> data;
free ( t) ;
return true;
}
int main ( )
{
Linkqueue * s;
ElemType n;
initqueue ( s) ;
enqueue ( s, 10 ) ;
enqueue ( s, 20 ) ;
enqueue ( s, 30 ) ;
enqueue ( s, 40 ) ;
enqueue ( s, 50 ) ;
printf ( "出队列为:\n" ) ;
dequeue ( s, n) ;
printf ( "%d\n" , n) ;
dequeue ( s, n) ;
printf ( "%d\n" , n) ;
dequeue ( s, n) ;
printf ( "%d\n" , n) ;
dequeue ( s, n) ;
printf ( "%d\n" , n) ;
dequeue ( s, n) ;
printf ( "%d\n" , n) ;
system ( "pause" ) ;
return 0 ;
}
七,实现环形队列的基本运算的算法
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define max 6
typedef struct queue
{
ElemType data[ max] ;
int front;
int rear;
} Squeue;
void initqueue ( Squeue * & s)
{
s = ( Squeue * ) malloc ( sizeof ( Squeue) ) ;
s-> front = s-> rear = 0 ;
}
void Destoryqueue ( Squeue * & s)
{
free ( s) ;
}
bool queueempty ( Squeue * s)
{
return ( s-> front == s-> rear) ;
}
bool enqueue ( Squeue * s, ElemType m)
{
if ( ( s-> rear + 1 ) % max == s-> front)
return false;
s-> rear = ( s-> rear + 1 ) % max;
s-> data[ s-> rear] = m;
printf ( "%d\n" , s-> data[ s-> rear] ) ;
return true;
}
bool dequeue ( Squeue * & s, ElemType & m)
{
if ( s-> front == s-> rear)
return false;
else
{
s-> front = ( s-> front + 1 ) % max;
m = s-> data[ s-> front] ;
return true;
}
}
int main ( )
{
Squeue * p;
ElemType n;
initqueue ( p) ;
enqueue ( p, 10 ) ;
enqueue ( p, 20 ) ;
enqueue ( p, 30 ) ;
enqueue ( p, 40 ) ;
enqueue ( p, 50 ) ;
printf ( "出队列为:\n" ) ;
dequeue ( p, n) ;
printf ( "%d\n" , n) ;
dequeue ( p, n) ;
printf ( "%d\n" , n) ;
dequeue ( p, n) ;
printf ( "%d\n" , n) ;
dequeue ( p, n) ;
printf ( "%d\n" , n) ;
dequeue ( p, n) ;
printf ( "%d\n" , n) ;
system ( "pause" ) ;
return 0 ;
}