复习栈

复习栈

通过读取文件,实现一个迷宫,利用bfs,找出路径,


/***************************************************************

Description: Inplement a maze and print the path with different symbols
Author: chendt
Version: 1.0
Date: 2021.3..23
History: So far,no changes.     

****************************************************************/
#include<iostream>
#include <fstream>
#include<iomanip>
using namespace std;
/*[Linked list---> Stack]  Use Linked lists to create a Stack,a struct is a nodes in Linked list.*/
typedef struct Stack_Element 
{
	int Maze_x,Maze_y;   /* X-coordinates,Y-coordinates */ 
	struct Stack_Element * next;        
}* pointer; 
pointer ps=NULL; /* Top pointer of the Stack*/
int start_x,start_y,end_x,end_y; /*start and end coordinates of the maze*/
int row,column; /*the size of the maze*/
const int Maxsize=20; /*the Maxsize of the maze about row and column*/
int Maze[Maxsize][Maxsize]; /*use array to store the maze */
void Pop()        
{
    if(ps==NULL)
    cout<<"Stack empty,";
    else
    {
        pointer p;
        p = ps;
	    ps=ps->next;
	    free(p);  
    }
	     
}
void push(int x,int y)     
{
	pointer t=(pointer)malloc(sizeof(struct Stack_Element));
		t ->Maze_x=x;
		t->Maze_y=y;
		t->next=NULL;
	if(ps==NULL)
		ps=t;
	else
	{
		t->next=ps;
		ps=t;
	}
}
void readMaze() /*read data from txt file and print the digital maze */
{
	ifstream myfile("in.txt"); 
	if (!myfile.is_open())
	{
		cout << "can not open this file" << endl;
	}
	else
	{
    	myfile>>row;
	    myfile>>column;
        myfile>>start_x;
   	    myfile>>start_y;
        myfile>>end_x;
        myfile>>end_y;
        for ( int i = 0; i <= row+1; i++)
	    {
			for(int j=0;j<=column+1;j++)
			{
				if(i==0||i>=row+1||j==0||j>=column+1)
				{
					Maze[i][j]=1;
					cout<<Maze[i][j]<<" ";
				}
				else
				{
					myfile>>Maze[i][j];
					cout<<Maze[i][j]<<" ";
				}
			}
			cout<<endl;
	    }

	}
	myfile.close();
}
void printMaze(int row,int column) /*print the pattern of the maze*/
{	
	
	for(int i=0; i<row;i++)
	{
		for(int j=0;j<column;j++)
		{
			if(Maze[i][j]==1)
				cout<<"#"<<" "; /*symbol"#" marked as wall of the maze*/
			else if(Maze[i][j]==2)
				cout<<"*"<<" "; /*symbol"*" marked as position wallked*/
			else if(Maze[i][j]==3)
				cout<<"@"<<" "; /*symbol"@" marked as a dead end*/
			else if(Maze[i][j]==0)
				cout<<"  ";   /*the spaces" " marked as position walkable but untraveled*/
		}
		cout<<endl;
    }
}
/**************************************************************
Function: Mazepath
Description: use DFS algorithm to seach a path
Calls: printMaze()
**************************************************************/
void Mazepath()    
{
	int i=start_x,j=start_y;
	Maze[i][j]=2; //number 2 marked the position walked
	push(i,j);
	while (i!=end_x || j!=end_y)
	{
		if(ps==NULL)
		{
			cout<<"There is no one path from ( "<<start_x<<","<<start_y<<" ) "<<"to ( "<<end_x<<","<<end_y<<")."<<endl;
			break;
		}
		else
		{
		if(Maze[i][j+1]==0) /*judge whether it can be moved to the right*/
		{
			j++;
			Maze[i][j]=2; /*marked this position hass passed*/
			push(i,j);
		}
		else if(Maze[i+1][j]==0) /*judge whether it can be moved to the up*/
		{
			i++;
			Maze[i][j]=2;
			push(i,j);
		}
		else if(Maze[i][j-1]==0) /*judge whether it can be moved to the left*/
		{
			j--;
			Maze[i][j]=2;
			push(i,j);
		}
		else if(Maze[i-1][j]==0) /*judge whether it can be moved to the down*/
		{
			i--;
			Maze[i][j]=2;
			push(i,j);
		}
		else
		{
			Maze[i][j]=3;
			Pop();
			i=ps->Maze_x;
			j=ps->Maze_y;
		}
		}
	}
	printMaze(end_x+2,end_y+2);
}

int main()                     
{
    readMaze();
	cout<<endl;
    Mazepath();
	return 0;
}
 

算中缀表达式的值

#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
const int Maxsize=40;
string expression;
char profix[Maxsize];
int j=0;
typedef struct StackOperator
{
    char Operator;
    struct StackOperator * next;
}*pointer;
pointer p=NULL;
void push(char data)
{
    pointer node=(pointer)malloc(sizeof(struct StackOperator));
    node->Operator=data;
    node->next=NULL;
    if(p==NULL)
        p=node;
    else
    {
        node->next=p;
        p=node;
    }
}
void pop()
{
    pointer d=p;
    p=p->next;
    free(d);
}

char getTopDate()
{
    return p->Operator;
}

int getPriority(char op)
{
    int prioritysize;
    if(op=='(')
        prioritysize=1;
    if(op=='+'||op=='-')
        prioritysize=2;
    if(op=='*'||op=='/')
        prioritysize=3;
    return prioritysize;
}
int comparePriority(char operator1,char operator2)
{
    int op1=getPriority(operator1);
    int op2=getPriority(operator2);
    if(op1>op2)
        return 1;
    else if(op1==op2)
        return 0;
    else
        return -1;
}
void transform()
{
    cin>>expression;
    for(int i=0;i<expression.length();i++)
    {
        char date=expression[i];
        char nextdate=expression[i+1];
        if(date>='0' && date<='9')
        {
            profix[j]=date;
            j++;
            if(nextdate=='+' || nextdate=='-' || nextdate=='*' ||nextdate=='/' )
            {
                profix[j]=' ';
                j++;
            }
        }
        else if(date == '(')
        {
            push(date);
        }
        else if(date == ')')
        {
            while(getTopDate() != '(')
            {
                profix[j]=getTopDate();
                j++;
                pop();
            }
            if(getTopDate()=='(')
                pop();
        }
        else
        {
            if(!p)
                push(date);
            else
            {
                if(comparePriority(getTopDate(),date)==-1) 
                {
                    push(date);
                }
                else
                {
                    if(comparePriority(getTopDate(),date) == 1 || comparePriority(getTopDate(),date) == 0)
                    {
                        profix[j]=getTopDate();
                        j++;
                        pop();
                        if(comparePriority(getTopDate(),date)==1||comparePriority(getTopDate(),date)==0)
                        {
                            profix[j]=getTopDate();
                            j++;
                            pop();
                        }
                    }
                    push(date);
                }
                
            }
        }

    }

    while(p)
    {
        profix[j]=p->Operator;
        j++;
        p=p->next;
    }
    
}


typedef struct StackOperant
{
    int Operant;
    struct StackOperant* next;

}* pointer1;
pointer1 t=NULL;
void push2(int date)
{
    pointer1 node =(pointer1)malloc(sizeof(struct StackOperant));
    node->Operant=date;
    node->next=NULL;
    if(t==NULL)
        t=node;
    else
    {
        node->next=t;
        t=node;
    }
}
void pop2()
{
    pointer1 temp=t;
    t=t->next;
    free(temp);
}
int getOperant()
{
    return t->Operant;
}
int evaluation()
{
    int small,big,g,tm;
     for(int c=0;c<j;c++)
    {
        char date=profix[c];
        if(date>='0' && date<='9')
        {
           int temp=(int)date-48;
           g=c+1;
           while(profix[g]!=' ' && profix[g]!='+' && profix[g]!='-' && profix[g]!='*' && profix[g]!='/')
           {
               temp=temp*10+(int)profix[g]-48;
               c++;
               g++;
           }
           push2(temp);
        }
        else
        {
            if(date==' ')
                continue;
            else
            {
                small=getOperant();
                pop2();
                big=getOperant();
                pop2();
                if(date == '+')
                {
                    push2(big+small);
                }
                else if(date == '-')
                {
                    push2(big-small);
                }
                else if(date == '*')
                {
                    push2(big*small);
                }
                else
                {
                    push2(big/small);
                }
            }
        }
    }
    return t->Operant;
}

      
          /*  switch(date)
            {
                case '+':
                    push2(big+small);
                case '-':
                    push2(big-small);
                case '*':
                    push2(big*small);
                case '/':
                    push2(big/small);
            }*/



            


int main()
{
    cout<<"Enter the expression: "<<endl;
    transform();
    cout<<"The Postfix is: ";
    for(int i=0; i<j; i++)
    {
        char date=profix[i];
        cout<<date;
    }
    cout<<endl<<"Profix has trosformed!"<<endl;
    cout<<"the evalution of Profix is: ";
    cout<< evaluation()<<endl;

}
上一篇:第十一章 运用广度优先搜索走迷宫


下一篇:1036. Escape a Large Maze