数据结构与算法(三)

    栈(stack) 是限定仅在表尾进行插入和删除操作的线性表。

我们把允许插入和删除的一端称为栈顶(top) ,另一端称为栈底(bottom) ,不含任何数据元素的称为空栈。栈又称为后进先出(Last In First out)的线性表,简称LIFO结构。

栈的特殊之处就在于限制这个线性表的插入和删除位置,它始终只在栈顶进行。这就使得:栈底是固定的,最先进栈的只能在栈底。

栈的插入操作,叫做进栈,也称压栈、入栈。类似于子弹入弹夹。(push)

栈的删除操作,叫做出栈,有的也叫弹栈。(pop)

//算法中模拟栈使用模板
3. 栈
// tt表示栈顶
int stk[N], tt = 0;

// 向栈顶插入一个数
stk[ ++ tt] = x;

// 从栈顶弹出一个数
tt -- ;

// 栈顶的值
stk[tt];

// 判断栈是否为空
if (tt > 0)
{
    
}

 java代码演示

package 栈;
import java.util.Scanner;

public class stack {
	
	public static void main(String[] args) {
		boolean c;
	    Scanner in=new Scanner(System.in);
		StringStack stack1=new StringStack();
		while(true) 
		{
		int x,y,i;
		
		
		System.out.println("1.进栈");
		System.out.println("2.出站");
		System.out.println("3.栈顶元素");
		System.out.println("4.栈是否为空");
		System.out.println("请选择:");
		x=in.nextInt();
		switch(x) {
		case 1:
			
			
				System.out.println("输入栈的长度");
				y=in.nextInt();
				System.out.println("输入进栈元素");
				for(i=0;i<y;i++)
			    {
				String input=in.next();
				stack1.push(input);
				}
			      break;
			        
		case 2:
			if(stack1.isEmpty())
				{
					System.out.println("此栈为空");
				}
			else while(!stack1.isEmpty())
				{
					System.out.println(stack1.pop()+"");
				}
				System.out.println();
			
			break;
		case 3:
			c=stack1.isEmpty();
			if(c==true)
			{
				System.out.println("栈为空");
			}
			else
			System.out.println(stack1.top());
			break;
		case 4:
			c=stack1.isEmpty();
			if(c==true)
			{
				System.out.println("栈为空");
			}
			else
			{
				System.out.println("栈不为空");
			}
			break;
			default:
				System.out.println("输入信息有误");
		
		}
		
		
		}
	}

}

算法题:

DFS

n 皇后(来源acwing )

 


#include<iostream>
using namespace std;

const int N=100;

int n;
char g[N][N];
bool col[N],dg[N],udg[N];
// col[]里面保存的是当前列元素 
// dg[] 和udg[]里面保存的对角线和反对角线元素


//U就相当于坐标中的x  (x,y)---(u,i)
void dfs(int u){
   
   if(u==n){
       for(int i=0;i<n;i++) puts(g[i]);
       cout<<endl;
       return;
       
       
   }
    
    for(int i=0;i<n;i++)
      if(!col[i]&&!dg[u+i]&&!udg[n-u+i]){
           g[u][i]='Q';
          col[i]=dg[u+i]=udg[n-u+i]=true;
          dfs(u+1);
          col[i]=dg[u+i]=udg[n-u+i]=false;
          g[u][i]='.';
      }

}


int main(){
    cin>>n;
    
    for(int i=0;i<n;i++)
       for(int j=0;j<n;j++)
           g[i][j]='.';
    
    dfs(0);
    
    return 0;
    
    
}















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值