栈和队列
栈
1.顺序栈的存储结构和基本操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top=-1;
}
bool StackEmpty(SqStack S){
if(S.top==-1)
return true;
else
return false;
}
bool Push(SqStack &S,int x){
if(S.top==MaxSize-1)
return false;
S.data[++S.top]=x;
return true;
}
bool Pop(SqStack &S,int &x){
if(S.top==-1)
return false;
x=S.data[S.top--];
return true;
}
bool GetTop(SqStack S,int &x){
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
int main(){
SqStack S;
int num=0;
int x=0;
int i=0;
InitStack(S);
printf("输入栈中元素个数:\n");
scanf("%d",&num);
printf("输入具体元素:\n");
for(i=0;i<num;i++){
scanf("%d",&x);
Push(S,x);
}
printf("栈中元素为:\n");
for(i=0;i<num;i++){
printf("%d ",S.data[i]);
}
printf("\n");
printf("出栈顺序为:\n");
while(S.top!=-1){
Pop(S,x);
printf("%d ",x);
}
printf("\n");
return 0;
}
2.共享栈
#define Maxsize 10
typedef struct{
ElemType data[Maxsize];
int top0;
int top1;
}ShStack;
void InitStack(ShStack &S){
S.top0=-1;
S.top1=Maxsize;
}
bool isFull(ShStack S){
if((S.top0+1)==S.top1)
return true;
else
return false;
}
3.链式存储
typedef struct Linknode{
int data;
struct Linknode *next;
}*LiStack;
队列
1.顺序存储
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 10
typedef struct{
int data[MaxSize];
int front,rear;
}SqQueue;
void InitQueue(SqQueue &Q){
Q.front=Q.rear=0;
}
bool isEmpty(SqQueue Q){
if(Q.rear==Q.front)
return true;
else
return false;
}
bool EnQueue(SqQueue &Q,int x){
if((Q.rear+1)%MaxSize==Q.front)
return false;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
return true;
}
bool DeQueue(SqQueue &Q,int &x){
if(Q.rear==Q.front)
return false;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
bool GetHead(SqQueue Q,int &x){
if(Q.rear==Q.front)
return false;
x=Q.data[Q.front];
return true;
}
int QueueLength(SqQueue Q){
int num;
num=(Q.rear+MaxSize-Q.front)%MaxSize;
return num;
}
void PrintQueue(SqQueue Q){
for(int i=Q.front;i!=Q.rear;i=(i+1)%MaxSize){
printf("%d ",Q.data[i]);
}
printf("\n");
}
int main(){
SqQueue Q;
int x;
int i=0;
int num=0;
InitQueue(Q);
printf("输入队列长度:\n");
scanf("%d",&num);
printf("分别输入他们的值:\n");
for(i=0;i<num;i++){
scanf("%d",&x);
EnQueue(Q,x);
}
printf("此时的队列为:\n");
PrintQueue(Q);
printf("对头两个元素出队,他们的值分别是:\n");
DeQueue(Q,x);
printf("%d ",x);
DeQueue(Q,x);
printf("%d ",x);
printf("此时的队列为:\n");
PrintQueue(Q);
return 0;
}
2.链式存储
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
bool isEmpty(LinkQueue Q){
if(Q.front==Q.rear) return true;
else return false;
}
void EnQueue(LinkQueue &Q,int x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
bool DeQueue(LinkQueue &Q,int &x){
if(Q.front==Q.rear) return false;
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}
void PrintQueue(LinkQueue Q){
LinkNode *p;
p=Q.front;
while(p->next!=NULL){
p=p->next;
printf("%d ",p->data);
}
printf("\n");
}
int main(){
LinkQueue Q;
int x,y;
int i=0;
InitQueue(Q);
printf("输入队列长度:\n");
scanf("%d",&x);
printf("输入具体元素值:\n");
for(i=0;i<x;i++){
scanf("%d",&y);
EnQueue(Q,y);
}
printf("此时队列中元素为:\n");
PrintQueue(Q);
printf("前两个元素出队,分别为:\n");
for(i=0;i<2;i++){
DeQueue(Q,y);
printf("%d ",y);
}
printf("\n出队后的队列为:\n");
PrintQueue(Q);
return 0;
}
3.双端队列
应用
1.栈的应用
1-1 括号匹配
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 50
typedef struct{
char data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top=-1;
}
bool StackEmpty(SqStack S){
if(S.top==-1)
return true;
else
return false;
}
bool Push(SqStack &S,char x){
if(S.top==MaxSize-1)
return false;
S.data[++S.top]=x;
return true;
}
bool Pop(SqStack &S,char &x){
if(S.top==-1)
return false;
x=S.data[S.top--];
return true;
}
bool GetTop(SqStack S,char &x){
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
void PrintStack(SqStack S){
int temp=S.top;
while(temp!=-1){
printf("%c ",S.data[temp--]);
}
}
bool bracketCheck(char str[],int length){
SqStack S;
InitStack(S);
int i=0;
for(i=0;i<length;i++){
if(str[i]=='('||str[i]=='['||str[i]=='{'){
Push(S,str[i]);
}
else{
if(StackEmpty(S)){
return false;
}
char topElem;
Pop(S,topElem);
if(str[i]==')'&&topElem!='('){
return false;
}
if(str[i]==']'&&topElem!='['){
return false;
}
if(str[i]=='}'&&topElem!='{'){
return false;
}
}
}
return StackEmpty(S);
}
int main(){
int sum=6;
char *str;
int i=0;
str=(char*)malloc(sizeof(char)*sum);
printf("输入6个半括号:\n");
for(i=0;i<sum;i++){
str[i]=getchar();
}
bool check;
check=bracketCheck(str,6);
if(check)
printf("字符串的括号是匹配的\n");
else
printf("字符串的括号是不匹配的\n");
return 0;
}