• 数据结构习题--栈与队列(2)


    双栈模拟队列
    基本思路:队列是先进先出,栈是先进后出。用一个输入栈存进队元素,用一个输出栈将输出栈中的元素倒置,再出栈。这就实现了队列的先进先出。
    注意:队满的条件为输入栈S1满且输出栈S2非空。并非输入栈满就代表队列满,因为如果输入栈满但输出栈空,可以将输出栈中的元素全部压入输出栈中,这就相当于队列没满,同时如果输出栈中有元素,则输入栈中的元素不能压入输出栈,如果压入就会打乱原有的序列。

    #include<stdio.h>
    #include<stdlib.h>
    #define maxsize 30
    typedef int datatype;
    typedef struct{
    	datatype data[maxsize];
    	int top;
    }SeqStack;
    
    void Initial(SeqStack *S){
    	S->top = -1;
    } 
    
    int StackIsFull(SeqStack *S){
        return S->top == maxsize-1;
    }
    
    int StackIsEmpty(SeqStack *S){
    	return S->top == -1;
    }
    
    int StackPop(SeqStack *S){
    	int k;
    	if(StackIsEmpty(S))
    	   return 0;
    	k = S->data[S->top--];
    	return k;
    }
    
    int StackPush(SeqStack *S,datatype x){
    	if(StackIsFull(S))
    	   return 0;
    	S->data[++S->top]=x;
    	return 1;
    }
    //判断队空 
    int QueueIsEmpty(SeqStack *S1,SeqStack *S2){
    	return StackIsEmpty(S1)&&StackIsEmpty(S2);	
    } 
    //进队列 
    int EnQueue(SeqStack *S1,SeqStack *S2,datatype x){
    	if(StackIsFull(S1)){  
    	    if(!StackIsEmpty(S2)){
    		    printf("用栈模拟的队列已满");
    	        return 0;
    	    }
    		else{
    		    int k;
    		    while(!StackIsEmpty(S1)){
    		       k = StackPop(S1);
    		       StackPush(S2,k);
    		    }
    	    }
    	}
    	StackPush(S1,x);
    	return 1; 
    }
    // 出队列 
    int DeQueue(SeqStack *S1,SeqStack *S2){
    	int  k;
    	if(QueueIsEmpty(S1,S2)){
    	   printf("用栈模拟的队列已空");
    	   return 0;
    	}
    	else{
    	    if(StackIsEmpty(S2)){
    		    while(!StackIsEmpty(S1)){
    			   k = StackPop(S1);
    			   StackPush(S2,k);
    		    }
    	    }
        }
    	return StackPop(S2);
    }
    
    void ImitateQueue(SeqStack *S1,SeqStack *S2){
    	Initial(S1);
    	Initial(S2);
    	int x;
    	printf("请输入进队元素:");
    	scanf("%d",&x);
    	while(x!=0){
    	    EnQueue(S1,S2,x);
    	    scanf("%d",&x);
    	}
    	printf("出队元素为:");
    	while(!QueueIsEmpty(S1,S2)){
    		int k;
    	    k = DeQueue(S1,S2);
    		printf("%d",k);
        } 
    }
    
    main(){
        SeqStack *S1 = (SeqStack*)malloc(sizeof(SeqStack));
    	SeqStack *S2 = (SeqStack*)malloc(sizeof(SeqStack));
    	ImitateQueue(S1,S2);
    }
    

    铁道车厢调度问题
    调车场两侧的铁道均为单向行驶道,中间有一段用于调度的“栈道”,调车场的入口有n节硬座和软座车厢(分别用H和S表示),设计一个算法,把所有软座车厢调度道硬座车厢前面来。要求输出对这n节车厢进行调度的结果序列。

    #include<stdio.h>
    #include<stdlib.h>
    #define maxsize 30
    typedef struct {
    	char data[maxsize];
    	int top;
    }SeqStack;
    
    void Initial(SeqStack *S){
    	S->top = -1;
    	} 
    	
    int IsFull(SeqStack *S){
    	return S->top==maxsize-1;
    }
    
    int IsEmpty(SeqStack *S){
    	return S->top==-1;
    }
    
    int Push(SeqStack *S,char x){
    	if(IsFull(S))
    	   return 0;
    	S->data[++S->top]=x;
    	return 1;
    }
    
    char Pop(SeqStack *S){
    	char c;
    	if(IsEmpty (S))
    	   return 0;
    	   c = S->data[S->top];
    	S->top--;
    	return c;
    }
    
    void Railway(SeqStack *S){
    	int i,j=0,n=9;
    	char train[n] = {'H','S','H','H','S','H','S','S','H'},result[n];
    	for(i=0;i<n;i++){
    		if(train[i]=='S')
    		  result[j++]=train[i];
    		else{
    		   Push(S,train[i]);
    		   }
    	}
    
    	while(!IsEmpty(S)){
    		for(;j<n;j++){
    			result[j]=Pop(S);
    		}
    	}
    	for(j=0;j<n;j++){
    		printf("%c",result[j]);
    	}
    	
    }
    
    main(){
        SeqStack *S = (SeqStack*)malloc(sizeof(SeqStack));
    	Initial(S);
    	Railway(S);
    }
    
  • 相关阅读:
    sqlserver中实现split分割字符串函数
    Sqlserver判断对象是否存在
    C#学习笔记(十):阴影和深度复制 [转]
    C#企业库自定义连接字符串.
    Jquery error 事件
    SQLserver不是可以识别的内置函数名称"的错误,通过set statistics time on能得到SQL语句的执行时间精确到毫秒.
    C#学习笔记(九):c#运算符重载.[简单理解]
    利用sql语句添加字段注释
    如何抓取google的搜索结果?
    SQL SERVER级联删除的简单实现方法
  • 原文地址:https://www.cnblogs.com/susususu/p/10854009.html
Copyright © 2020-2023  润新知