是栈还是队列c语言实验报告怎么写,队列和栈(C语言)
棧和隊(duì)列的基本性質(zhì)
棧是先進(jìn)后出的結(jié)構(gòu)(彈夾)
隊(duì)列是先進(jìn)先出的(排隊(duì))
棧和隊(duì)列在實(shí)現(xiàn)結(jié)構(gòu)上可以有數(shù)組和鏈表兩種方式
棧結(jié)構(gòu)的基本操作:
1、彈棧
2、訪問棧頂元素
3、壓棧操作
4、返回當(dāng)前棧中的元素個(gè)數(shù)
隊(duì)列結(jié)構(gòu)的基本操作:
1、隊(duì)列元素進(jìn)隊(duì)列是從隊(duì)尾插入的
2、隊(duì)列元素出隊(duì)列是從對頭彈出的 ? ? ? ? ? ? (類似于日常排隊(duì))
/*棧的結(jié)構(gòu)定義(順序棧)*/
#define MAXSIZE 100
typedef int ElemType; /*視棧中要存放的具體元素類型而定*/
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE]; //利用系統(tǒng)的棧來存放棧元素
int top;
}Stack;
typedef struct
{
ElemType *base; //利用堆來存放棧的元素
ElemType *top; //棧頂指針和棧底指針
int count; //棧的大小
}Stack1;
/*棧的初始化*/
Status InitStack(Stack *s)
{
if(s == NULL)
{
return -1;
}
s->top = -1; //初始化棧頂指針
return 0;
}
#define NUM 10
Status InitStack(Stack1 *s1)
{
if(s1 == NULL)
{
return -1;
}
s1->top = (ElemType *)malloc(sizeof(ElemType)*NUM); //初始化棧頂指針
if(NULL == s1->top)
{
return -1; //申請內(nèi)存失敗
}
s1->base = s1->top;
s1->count = 0;
return 0;
}
/*壓棧*/
Status push(Stack *s, ElemType e)
{
if(s->top == MAXSIZE-1)
{
//棧滿
return -1;
}
s->top++;
s->data[s->top] = e;
return 0;
}
Status push(Stack1 *s1, ElemType e)
{
if(s1->top == s1->base+NUM-1)
{
//棧滿
return -1;
}
*(s1->top) = e;
s1->top++;
s1->count++;
return 0;
}
/*出棧*/
Status pop(Stack *s, ElemType *e)
{
if(s->top == -1)
{
//棧空
return -1;
}
*e = s->data[s->top];
s->top--;
return 0;
}
Status pop(Stack1*s1, ElemType *e)
{
if(s1->top == s1->base)
{
//棧空
return -1;
}
*e = *(s1->top);
s1->top--;
s->count--;
return 0;
}
/*鏈?zhǔn)綏?/
/*棧元素的(節(jié)點(diǎn)的結(jié)構(gòu))和棧結(jié)構(gòu)的定義*/
typedef int ElemType;
typedef int Status;
/*結(jié)點(diǎn)的結(jié)構(gòu)*/
typedef struct node
{
ElemType data;
struct node *next;
}Node;
/*棧的結(jié)構(gòu)*/
typedef struct
{
struct node *top; //棧頂指針
int count; //用來記錄棧元素的個(gè)數(shù)
}Stack;
/*鏈棧初始化*/
Status InitStack(Stack *s)
{
if(NULL == s)
{
return -1;
}
s->top = NULL; //棧空,棧頂指針指向NULL
s->count = 0;
return 0;
}
/*把鏈表的頭指針當(dāng)作棧的棧頂指針,鏈表的尾結(jié)點(diǎn)當(dāng)作棧底*/
/*棧元素只在棧頂進(jìn)棧或者出棧*/
/*壓棧*/
Status push(Stack *s, ElemType e)
{
if(NULL == s)
{
return -1;
}
Node *p = (Node *)malloc(sizeof(Node)); //申請一個(gè)節(jié)點(diǎn)
if(NULL == p)
{
return -1;
}
p->data = e;
p->next = s->top; //令新創(chuàng)建的節(jié)點(diǎn)指向當(dāng)前的棧頂
s->top = p; //棧頂指針指向新壓棧的元素
s->count++;
return 0;
}
/*出棧*/
Status pop(Stack *s, ElemType *e)
{
if(NULL==s || NULL==s->top)
{
return -1;
}
*e = s->top->data; //取出棧頂元素的值
Node *temp = s->top; //保存當(dāng)前要出棧的棧頂元素的地址
s->top = s->top->next; //將棧頂指針移向下一個(gè)元素
s->count--;
free(temp); //釋放當(dāng)前棧頂元素的指針
return 0;
}
/*循環(huán)隊(duì)列(順序結(jié)構(gòu))*/
#define MAXSIZE 10 //隊(duì)列的大小
typedef int ElemType;
typedef int Status;
/*順序隊(duì)列結(jié)構(gòu)*/
typedef struct
{
ElemType data[MAXSIZE]; //利用系統(tǒng)的棧來存放隊(duì)列的元素
int front; //隊(duì)頭(出隊(duì))
int rear; //隊(duì)尾(進(jìn)隊(duì))
}Queue;
/*隊(duì)列的初始化*/
Status InitQueue(Queue *q)
{
if(NULL == q)
{
return -1;
}
q->rear = 0;
q->front = 0;
return 1;
}
/*返回循環(huán)隊(duì)列的元素個(gè)數(shù)*/
int NumQueue(Queue *q)
{
return (q->rear-q->front+MAXSIZE)%MAXSIZE;
}
/*進(jìn)隊(duì)列(從隊(duì)尾進(jìn)隊(duì))*/
Status EnQueue(Queue *q, ElemType e)
{
if(NULL==q || (q->rear+1)%MAXSIZE==q->front)
{
return -1;
}
q->data[q->rear] = e;
q->rear = (q->rear+1) % MAXSIZE;
return 0;
}
/*出隊(duì)列(從隊(duì)頭出隊(duì))*/
Status OutQueue(Queue *q, ElemType *e)
{
if(q==NULL || q->rear==q->front)
{
return -1;
}
*e = q->data[q->front];
q->front = (q->front+1) % MAXSIZE;
return 0;
}
/*用鏈表實(shí)現(xiàn)隊(duì)列*/
/*隊(duì)列元素的結(jié)點(diǎn)結(jié)構(gòu)和隊(duì)列結(jié)構(gòu)*/
/*隊(duì)列存儲的元素的類型*/
typedef int ElemType;
typedef int Status;
/*結(jié)點(diǎn)結(jié)構(gòu)*/
typedef struct node
{
ElemType data;
struct node *next;
}Node;
/*隊(duì)列結(jié)構(gòu)(一個(gè)隊(duì)頭指針,一個(gè)隊(duì)尾指針)*/
typedef struct
{
struct node *front;
struct node *rear;
}Queue;
/*鏈?zhǔn)疥?duì)列的初始化*/
/*無頭結(jié)點(diǎn)*/
Status InitQueue(Queue *q)
{
if(NULL == q)
{
return -1;
}
q->front = NULL;
q->rear = NULL;
return 0;
}
/*有頭結(jié)點(diǎn)*/
Status InitQueue(Queue *q)
{
if(NULL == q)
{
return -1;
}
/*創(chuàng)建一個(gè)頭結(jié)點(diǎn)*/
Node *p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
return -1;
}
/*初始化頭結(jié)點(diǎn)和隊(duì)頭隊(duì)尾指針*/
p->next = NULL;
q->front = p;
q->rear = p;
return 0;
}
/*元素進(jìn)隊(duì)列*/
Status EnQueue(Queue *q, ElemType e)
{
if(NULLL == q)
{
return -1;
}
Node *temp = (Node *)malloc(sizeof(Node));
if(NULL == temp)
{
//申請內(nèi)存失敗
return -1;
}
/*初始化新插入的節(jié)點(diǎn)*/
temp->next = NULL;
temp->data = e;
/*從隊(duì)尾連接新插入的節(jié)點(diǎn)并把隊(duì)尾指針指向新插入的節(jié)點(diǎn)*/
q->rear->next = temp;
q->rear = temp;
return 0;
}
/*元素出隊(duì)列*/
/*無頭結(jié)點(diǎn)版本,從隊(duì)頭出隊(duì)*/
Statu OutQueue(Queue *q, ElemType *e)
{
if(NULL == q || (NULL==q->rear))
{
return -1;
}
if(q->front == q->rear)
{
/*如果大家都指向同一個(gè)節(jié)點(diǎn)證明隊(duì)列只有一個(gè)元素,那么q->rear也應(yīng)該要改變*/
free(q->front);
q->front = NULL;
q->rear = NULL;
return 0;
}
Node *temp = q->front;
*e = q->front->data;
q->front = q->front->next;
free(temp);
return 0;
}
/*有頭結(jié)點(diǎn)版本*/
Status OutQueue(Queue *q, ElemType *e)
{
if(NULL==q || (q->rear==q->front))
{
return -1;
}
Node *temp = q->front->next;
if(q->front->next == q->rear)
{
q->rear = q->front;
}
q->front->next = temp->next;
*e = temp->data;
free(temp);
return 0;
}
/*計(jì)算隊(duì)列元素的數(shù)量*/
/*無頭結(jié)點(diǎn)*/
int NumQueue(Queue *q)
{
if(NULL == q)
{
return -1;
}
int count = 1;
Node *temp1 = q->front;
Node *temp2 = q->rear;
if(temp1==NULL && temp2==NULL)
{
return 0;
}
else if(temp1 == temp2)
{
return count;
}
while(temp1 != temp2)
{
count++;
temp1 = temp1->next;;
}
return count;
}
總結(jié)
以上是生活随笔為你收集整理的是栈还是队列c语言实验报告怎么写,队列和栈(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言程序中的错误可分为,《C语言程序设
- 下一篇: c语言比较当前日期大小,C语言判断两个日