一.顺序栈
1 .顺序栈
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxsize 10
typedef struct{
int data[maxsize];
int top;
}sqtack;
void initstack(sqtack * sk){
sk->top =-1;
}
bool stackempty(sqtack sk){
if(sk.top == -1){
return true;
}
else
return false;
}
bool push(sqtack *sk,int element){
if(sk->top ==maxsize-1){
return false;
}
sk->data[++sk->top]=element;
return true;
}
bool pop(sqtack *sk,int* element ){
if(sk->top ==-1){
printf("\n当前栈为空栈,出栈失败!\n");
return false;
}
*element=sk->data[sk->top--];
printf("\t出栈:%d",*element);
return true;
}
bool gettop(sqtack sk,int *element){
if(sk.top == -1)
return false;
*element=sk.data[sk.top];
printf("当前栈顶元素:%d \n",*element);
return true;
}
void print_stack(sqtack sk){
printf("栈中元素:");
while(sk.top!=-1){
printf("\t %d",sk.data[sk.top--]);
}
printf("\n");
}
void test(){
sqtack sk;
int element;
initstack(&sk);
push(&sk,1);
gettop(sk,&element);
push(&sk,2);
gettop(sk,&element);
push(&sk,3);
gettop(sk,&element);
push(&sk,4);
gettop(sk,&element);
print_stack(sk);
pop(&sk,&element);
pop(&sk,&element);
pop(&sk,&element);
pop(&sk,&element);
pop(&sk,&element);
}
int main()
{
test();
return 0;
}
2.共享栈
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxsize 10
typedef struct{
int data[maxsize];
int top1;
int top2;
}sharestack;
void print_stack(sharestack sk){
printf("该共享栈中元素:\n");
printf("\t栈1中元素:");
while(sk.top1!=maxsize){
printf("\t %d",sk.data[sk.top1++]);
}
printf("\n");
printf("\t栈2中元素:");
while(sk.top2!=-1){
printf("\t %d",sk.data[sk.top2--]);
}
printf("\n");
}
void initstack(sharestack * sk){
sk->top1 =maxsize;
sk->top2 =-1;
}
bool stackempty(sharestack sk){
if(sk.top2 == -1 && sk.top1==maxsize){
return true;
}
else
return false;
}
bool push(sharestack *sk,int element,int num){
if(sk->top1 ==sk->top2+1){
return false;
}
if(num==1)
sk->data[--sk->top1]=element;
else if(num==2)
sk->data[++sk->top2]=element;
else
printf("该共享栈仅栈1和栈2\n");
return true;
}
bool pop(sharestack *sk,int* element,int num){
if(sk->top2 ==-1 && sk->top1==maxsize){
printf("\n当前栈为空栈,出栈失败!\n");
return false;
}
if(num==1){
if(sk->top1!=maxsize){
*element=sk->data[sk->top1++];
printf("\t栈1出栈:%d",*element);
}
else printf("\n栈1当前为空栈!\n");
}
else if(num==2){
if(sk->top2!=-1){
*element=sk->data[sk->top2--];
printf("\t栈2出栈:%d",*element);
}
else printf("栈2当前为空栈!\n");
}
return true;
}
bool gettop(sharestack sk,int *element,int num){
if(sk.top1 == maxsize && sk.top2 ==-1)
return false;
if(num==1){
*element=sk.data[sk.top1];
printf("当前栈1顶元素:%d \n",*element);
}
else if(num==2){
*element=sk.data[sk.top2];
printf("当前栈2顶元素:%d \n",*element);
}
return true;
}
void test(){
sharestack sk;
int element;
initstack(&sk);
push(&sk,1,1);
gettop(sk,&element,1);
push(&sk,2,2);
gettop(sk,&element,2);
push(&sk,3,1);
gettop(sk,&element,1);
push(&sk,4,2);
gettop(sk,&element,2);
print_stack(sk);
printf("出栈:\n");
pop(&sk,&element,1);
pop(&sk,&element,2);
pop(&sk,&element,1);
pop(&sk,&element,2);
pop(&sk,&element,1);
pop(&sk,&element,2);
}
int main()
{
test();
return 0;
}
3.链栈(不带头节点)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stddef.h>
#include<malloc.h>
typedef struct node{
int data;
struct node *next;
}node,*linklist;
linklist init(linklist lt){
lt =NULL;
return lt;
}
void print_list(linklist lt){
if(lt==NULL){
printf("当前为空表!\n");
return ;
}
printf("链表元素中有:");
while(lt)
{
printf("%d\t",lt->data);
lt= lt->next;
}
printf("\n");
}
linklist head_insert(linklist lt){
int n=0, e=0;
printf("请输入要插入元素个数:");
scanf("%d",&n);
printf("\t请输入插入的元素:");
for(int i=0;i<n;i++)
{
node*s = (node*)malloc(sizeof(node));
scanf("%d",&e);
s->data =e;
s->next = lt;
lt = s;
}
return lt;
}
linklist head_delete(linklist lt){
if(lt==NULL){
printf("当前为空表!\n");
return lt;
}
node *temp=lt;
lt = lt->next;
free(temp);
return lt;
}
int main()
{
linklist lt;
lt =init(lt);
lt = head_insert(lt);
print_list(lt);
lt=head_delete(lt);
print_list(lt);
return 0;
}
二.队列
1.顺序队列
#include <stdio.h>
#include <stdlib.h>
#define max 10
typedef struct{
int data[max];
int front,rear;
}sqqueue;
void init(sqqueue* lt){
lt->front=0;
lt->rear=0;
}
int EnQueue(sqqueue* lt,int element){
if(lt->rear == max) return 0;
lt->data[lt->rear++]=element;
return 1;
}
int DeQueue(sqqueue*lt){
if(lt->front == lt->rear) return 0;
int element =lt->data[lt->front++];
return element;
}
int queueempty(sqqueue lt){
if(lt.front == lt.rear){
printf("当前队列为空!\n");
return 0;
}
else{
printf("当前队列非空!\n");
return 1;
}
}
int gethead(sqqueue lt){
int element=lt.data[lt.front];
return element;
}
void print_Queue(sqqueue lt){
if(lt.front == lt.rear){
printf("\t当前队列为空!\n");
return ;
}
printf("当前队列中元素有:");
int i=lt.front;
while(i <lt.rear){
printf("\t %d",lt.data[i++]);
}
printf("\n");
}
int main()
{
sqqueue lt;
init(<);
queueempty(lt);
EnQueue(<,1);
EnQueue(<,2);
print_Queue(lt);
int head=gethead(lt);
printf("队头:%d \n",head);
DeQueue(<);
print_Queue(lt);
DeQueue(<);
print_Queue(lt);
return 0;
}
2.循环队列
#include <stdio.h>
#include <stdlib.h>
#define max 5
typedef struct{
int data[max];
int front,rear;
}sqqueue;
void init(sqqueue* lt){
lt->front=0;
lt->rear=0;
}
void print_queue(sqqueue lt){
printf("\n");
if(lt.front ==lt.rear){
printf("\t当前循环队列为空!\n");
return ;
}
printf("当前队列中元素有:");
int i =lt.front;
while((i)%max !=lt.rear){
printf("\t %d",lt.data[i]);
i =(i+1)%max;
}
printf("\n");
}
int queueempty(sqqueue lt){
if(lt.front == lt.rear){
printf("当前队列为空!\n");
return 0;
}
else{
printf("当前队列非空!\n");
return 1;
}
}
void gethead(sqqueue lt ,int *element){
*element=lt.data[lt.front];
}
int getlength(sqqueue lt){
printf("队列长度:%d\n",(lt.rear +max -lt.front)%max);
return (lt.rear +max -lt.front)%max;
}
void EnQueue(sqqueue* lt,int element){
if((lt->rear +1)% max !=lt->front){
lt->data[lt->rear] =element;
lt->rear = (lt->rear +1 )%max;
}
else printf("\t队列已满\n");
}
void DeQueue(sqqueue* lt){
if(lt->front !=lt->rear){
int element = lt->data[lt->front];
lt->front =(lt->front+1) %max;
printf("\t %d",element);
}
else printf("\n 队列为空对列,出队失败!");
}
int main()
{
sqqueue lt;
init(<);
queueempty(lt);
printf("进队:");
EnQueue(<,1);
EnQueue(<,2);
EnQueue(<,3);
EnQueue(<,4);
printf("\t 对头下标:%d 队尾下标:%d\n",lt.front,lt.rear);
printf("\t 对头元素:%d 队尾元素:%d\n",lt.data[lt.front],lt.data[lt.rear]);
EnQueue(<,5);
EnQueue(<,6);
print_queue(lt);
getlength(lt);
printf("出队:");
DeQueue(<);
DeQueue(<);
DeQueue(<);
print_queue(lt);
printf("第二次进队出队:\n");
EnQueue(<,11);
EnQueue(<,21);
print_queue(lt);
printf("\t 对头下标:%d 队尾下标:%d\n",lt.front,lt.rear);
printf("\t 对头元素:%d 队尾元素:%d\n",lt.data[lt.front],lt.data[lt.rear]);
DeQueue(<);
getlength(lt);
EnQueue(<,31);
print_queue(lt);
DeQueue(<);
print_queue(lt);
return 0;
}
3.链式存储的队列
1.带头节点
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node{
int data;
struct node*next;
}node;
typedef struct{
node *front,*rear;
}LinkQueue;
void init(LinkQueue* lq){
lq->front =lq->rear =(node *)malloc(sizeof(node));
lq->front->next=NULL;
}
void EnQueue(LinkQueue *lq,int element){
node *temp =(node*)malloc(sizeof(node));
temp->next =NULL;
temp->data =element;
lq->rear->next =temp;
lq->rear = temp;
}
int DeQueue(LinkQueue *lq){
if(lq->front == lq->rear){
printf("\t当前队列为空!\n");
return 0;
}
else{
node *temp =lq->front->next;
int element=temp->data;
lq->front->next = temp->next;
if(temp ==lq->rear){
lq->rear = lq->front;
}
free(temp);
printf("\t出队:%d",element);
return element;
}
}
int Queueempty(LinkQueue *lq){
if(lq->front ==lq->rear){
return 0;
}
else
return 1;
}
void print_lq(LinkQueue* lq){
if(lq->front == lq->rear){
printf("当前链队为空! \n");
return ;
}
node*temp =lq->front->next;
printf("链队中元素有:");
while(temp!=NULL){
printf("\t %d",temp->data);
temp =temp->next;
}
printf("\n");
}
int main()
{
LinkQueue* lq = (LinkQueue *)malloc(sizeof(LinkQueue));
init(lq);
EnQueue(lq,1);
EnQueue(lq,2);
EnQueue(lq,3);
print_lq(lq);
DeQueue(lq);
DeQueue(lq);
printf("\n");
print_lq(lq);
DeQueue(lq);
DeQueue(lq);
print_lq(lq);
free(lq);
return 0;
}
2.不带头节点
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct node{
int data;
struct node*next;
}node;
typedef struct{
node *front,*rear;
}LinkQueue;
void init(LinkQueue* lq){
lq->front=NULL;
lq->rear=NULL;
}
void EnQueue(LinkQueue *lq,int element){
node *temp =(node*)malloc(sizeof(node));
temp->next =NULL;
temp->data =element;
if(lq->rear ==NULL){
lq->front =temp;
lq->rear =temp;
}
else{
lq->rear->next =temp;
lq->rear = temp;
}
}
int DeQueue(LinkQueue *lq){
if(lq->front == NULL){
printf("\t当前队列为空!\n");
return 0;
}
else{
node *temp =lq->front;
int element=temp->data;
lq->front = temp->next;
if(NULL ==lq->front){
lq->rear = NULL;
}
free(temp);
printf("\t出队:%d",element);
return element;
}
}
int Queueempty(LinkQueue *lq){
if(lq->front ==lq->rear){
return 1;
}
else
return 0;
}
void print_lq(LinkQueue* lq){
if(lq->front == NULL){
printf("当前链队为空! \n");
return ;
}
node*temp =lq->front;
printf("链队中元素有:");
while(temp!=NULL){
printf("\t %d",temp->data);
temp =temp->next;
}
printf("\n");
}
int main()
{
LinkQueue* lq = (LinkQueue *)malloc(sizeof(LinkQueue));
init(lq);
EnQueue(lq,1);
EnQueue(lq,2);
EnQueue(lq,3);
print_lq(lq);
DeQueue(lq);
DeQueue(lq);
printf("\n");
print_lq(lq);
DeQueue(lq);
DeQueue(lq);
print_lq(lq);
free(lq);
return 0;
}
课后习题
3.3栈实现递归函数的非递归计算
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define maxsize 10
typedef struct{
int data;
double va;
}sqtack[maxsize];
int test(int n,double x){
sqtack s;
int top=-1,i;
double fv1=1,fv2=2*x;
for(i=n;i>=2;i--){
s[++top].data=i;
}
while(top>=0){
s[top].va=2*x*fv2 -2*(s[top].data-1)*fv1;
fv1=fv2;
fv2=s[top--].va;
}
if(n==0){
printf("\t 第一种:%f\n",fv1);
return fv1;
}
else{
printf("\t 第二种:%f\n",fv2);
return fv2;
}
}
int main()
{
test(2,2);
return 0;
}