DS博客作业02--栈和队列

0.PTA得分截图

1.本周学习总结

1.1 总结栈和队列内容

  • 栈的存储结构及操作
    DS博客作业02--栈和队列_第1张图片
bool Push(Stack S, ElementType X)//入栈
{
    if (S->Top >= S->MaxSize)
    {
        printf("Stack Full\n");
        return false;
    }
    else
    {
        S->Data[++(S->Top)]=X;
        return X;
    }

}

ElementType Pop(Stack S)//出栈
{
    if (S->Top == 0)
    {
        printf("Stack Empty\n");
        return ERROR;
    }
    else
    {
        return (S->Data[(S->Top)--]);
    }
}
  • 栈的应用(判断表达式中的括号是否正确配对)
#include
#include
using namespace std;
int main() {
	string s;
	cin >> s;
	stack st;
	int flag = 1;
    int flag1=0;
	for (int i = 0; i < s.size(); i++) 
    {
		if (s[i] == '(' || s[i] == '[' || s[i] == '{') 
        {
			st.push(s[i]);
            flag1=1;
		}
		else if (s[i] == ')' || s[i] == ']' || s[i] == '}') 
        {
            if(st.empty())
            {
                cout<<"no";
                return 0;
            }
			char temp = st.top();
			st.pop();
			if (!((s[i] == ')' && temp == '(') || (s[i] == ']' && temp == '[') || (s[i] == '}' && temp == '{'))) 
            {
				flag = 0;
				cout << temp << endl << "no";
				return 0;
			}
		}
	}
	if (st.empty()) 
    {
		cout << "yes";
	}
	else 
    {
		cout << st.top() << endl << "no";
	}
}
  • 队列的存储结构及操作
    DS博客作业02--栈和队列_第2张图片
bool AddQ(Queue Q, ElementType X)//入队
{
    if (Q->Count == Q->MaxSize)
    {
        printf("Queue Full\n");
        return false;
    }
    Q->Data[(Q->Count+1+Q->Front) % Q->MaxSize] = X;
    Q->Count++;
}


ElementType DeleteQ(Queue Q)//出队
{
    if (Q->Count == 0)
    {
        printf("Queue Empty\n");
        return ERROR;
    }
    Q->Count--;
    Q->Front = (Q->Front + 1) % (Q->MaxSize);
    return Q->Data[Q->Front];
}
  • 队列应用(报数游戏)
    while (s.size() != 0) {
        for (int i = 1; i < m; i++) 
        {
            if (it == s.end()) {
                it = s.begin();
            }
            it++;
        }
        if (!(it != s.end()))
        {
            it = s.begin();
        }
        
        if (flag == 0) 
        {
            cout << *it;
            flag = 1;
        }
        else 
        {
            cout <<" "<< *it;
        }
            
        int c = *it;
        s.erase(c);
        int j = 1;
        while (1) 
        {
            it = s.find((c + j) % n);
            if (it != s.end())
                break;
            else
                j++;
            if(j==n)
            {
                break;
            }
        }
    }

2.PTA实验作业

2.1符号配对

2.1.1代码截图

DS博客作业02--栈和队列_第3张图片
DS博客作业02--栈和队列_第4张图片
DS博客作业02--栈和队列_第5张图片
DS博客作业02--栈和队列_第6张图片

2.1.2本题PTA提交列表说明



一开始是因为编译器没选对,导致编译一直失败,因为此题老师讲过,所以问题不大。

2.2字符串是否对称

2.2.1代码截图

DS博客作业02--栈和队列_第7张图片

2.2.2本题PTA提交列表说明

DS博客作业02--栈和队列_第8张图片

3.阅读代码

3.1 题目及解题代码

DS博客作业02--栈和队列_第9张图片
DS博客作业02--栈和队列_第10张图片

3.1.1 该题的设计思路

DS博客作业02--栈和队列_第11张图片

3.1.2 该题的伪代码

//我的思路是: 想象一个人在二维格子上走,边走边撒字母A-B-C...Z-A ,
//所以只需控制他走的方向 而且 并不难控制,因为他的方向总是右-下-左-上循环
#define M 10
#define N 20
int main(int argc, const char * argv[]) {
        char MAP[M][N] = {0};
        int r = 0,/*行*/ c = -1,/*列*/ p = 0,/*步数*/ dir = 1/*方向 1 右 2下 3左 4上*/;
       //初始面向右边,身处第0行第-1列(没开始走进格子)
//开始走
for (; p < M * N; ) {
if (dir == 1) {                
if (c + 1 <= N - 1 && MAP[r][c + 1] == 0) 
{                     
//可以继续向右                     
c++;                     
MAP[r][c] = (p++) % 26 + 'A';                 
}                 
else {                    
//不能再向右,转到下一个方向                     
dir++;                 
}             
}            
if (dir == 2) 
{                
if (r + 1 <= M - 1 && MAP[r + 1][c] == 0) 
{                    
r++;                    
MAP[r][c] = (p++) % 26 + 'A';                
}                
else 
{                    
dir++;                
}             
}            
if (dir == 3) 
{                
if (c - 1 >= 0 && MAP[r][c - 1] == 0) 
{                    
c--;                    
MAP[r][c] = (p++) % 26 + 'A';                
}                
else 
{                    
dir++;                
}             
}             
if (dir == 4) 
{                 
if (r - 1 >= 0 && MAP[r - 1][c] == 0) 
{                     
r--;                     
MAP[r][c] = (p++) % 26 + 'A';                 
}                 
else 
{                     
dir=1;                 
}             
}         
}                   
for (int i = 0; i < M; i++) 
{             
for (int j = 0; j < N; j++) 
{                 printf("%c ", MAP[i][j]);             }             
printf("\n");         
}         
return 0;     
}

你可能感兴趣的:(DS博客作业02--栈和队列)