0.Pythonとしてデータ構造を用いる

53822 ワード

スタック


Pythonのスタック在庫はパンダにあります.問題は、パンダスを使うのは耳が聞こえない、イザンタ.
代わりにリストがあり、使いやすいです.
- 선언
stack = []

-추가 및 삭제
stack.append(4)
stack.pop() #데이터 삭제 및 반환

- 조회
stack[-1]

- 기타
len(stack)==0 #데이터 없음
if(stack) #데이터 존재하는지 확인
len(stack) #데이터 갯수 확인
stack.clear(): 스택 비우기
#include <stack>
- 선언
stack<T> st;

- 추가 및 삭제
push(element): top에 원소를 추가
pop(): top에 있는 원소를 삭제

- 조회
top(): top(스택의 처음이 아닌 가장 끝)에 있는 원소를 반환

- 기타
empty(): 스택이 비어있으면 true 아니면 false를 반환
size(): 스택 사이즈를 반환

質問する


9093単語反転


python
한 줄 그대로 읽기
s=sys.stdin.readline()

리스트에서 문자열로 특정문자를 중간중간 삽입하기
print(':'.join(stack[::-1])
import sys
sys.stdin = open("input.txt","r")

t = int(input())

for _ in range(t):
    s = sys.stdin.readline()
    stack=[]
    for ch in s:
        if(ch == ' ' or ch=='\n'):
            print(''.join(stack[::-1]),end='')
            stack.clear()
            print(ch,end='')
        else:
            stack.append(ch)
文字列に関する問題を処理する場合、Stringを1回読み込むのは、逐字処理よりもずっと便利です.
取得時にgetline関数を使用する
getline関数はstringです.hとstringライブラリはそれぞれ1つあります.
cstring(string.h)のgetline関数はcharフォーマットの文字列を処理するために使用されるため、使用時にgetline(chars、streamsize n、char delim)の制限があり、delimeはその文字に達すると抽出が停止することを示す.
使用時
#include <iostream>
char greeting[100];
cin.getline(greeting,10);
上記の形式を使用
逆にStringクラスのgetlineはgetline(ifstream&is、string&str、char delim)
使用時
#include <string>
string greeting;
getline(cin,greeting);
上記の形式を使用
stringループ文は、文字を次のように繰り返し検索することもできます.
for(char ch:str){
}
#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <iostream>
#include <cstring>
#include <cstdio>
#include <functional>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <ctime>
#include <cmath>
#include <stack>
#include <string>
#define ll long long
#define len 1001
using namespace std;

int main(void) {
	freopen("input.txt", "r", stdin);
	
	int t;
	scanf("%d\n", &t);
	stack<char> st;

	while (t--) {
		string d;
		getline(cin, d);
		d += '\n';
		for (char ch : d) {
			if (ch == ' ' || ch == '\n') {
				while (!st.empty()) {
					printf("%c", st.top());
					st.pop();
				}
				printf("%c", ch);
			}
			else {
				st.push(ch);
			}
		}
	}
}

9012かっこ

import sys
sys.stdin = open("input.txt","r")

t = int(input())

for i in range(t):
    d=0
    s = input()
    flag = True
    for j in range(len(s)):
        if(s[j]=='('): d=d+1
        elif(s[j]==')'): d=d-1

        if(d<0):
            print("NO")
            flag = False
            break

    if(d==0 and flag): print("YES")
    elif(flag): print("NO")

1874スタック数列


私たちは順番にpushとpopを使って数字を挿入しているように見えますが、これは私たちが望んでいる数列に従って押す方法、pop数字を見つける問題です.
Pythonで、文字列を特定の文字で区切る場合は「n」を選択します.join(ans)を使えばいいです.
exit(0):問題のない脱出
exit(1):問題のある終了
import sys
sys.stdin = open("input.txt","r")

t = int(input())
a = [int(input()) for _ in range(t)]
st=[]
ans=""
m=0
for x in a:
    if(x>m):
        while(x>m):
            m=m+1
            st.append(m)
            ans+="+"
        st.pop()
        ans+="-"
    else:
        if st[-1]!=x:
            print("NO")
            sys.exit(0)
        st.pop()
        ans+="-"

print("\n".join(ans),end="\n")

1406編集


問題はありません.リストを逆作成するときにreverse()関数を使用するだけです.
rst.RS[:-1]逆()またはリスト参照を使用してlstにすべてのデータを貼り付けます.
また、入力()は、データの両端に「n」が付加されているためです.strip()関数を使用することが望ましい.
データ入力時
list(input().strip()と[input().strip()]は別の言い方です.
list(input().strip()はアルファベット別にlistに入ります.
[input().strip()]は、文字列全体からなるリストです.
また、入力速度を速めるためsys.stdinを使ったほうがいいです.
sys.stdin.readline
sys.stdin
一般的に次のように使用されます.
input = sys.stdin.readline
lst = list(input().strip())
import sys
sys.stdin = open("input.txt","r")

input = sys.stdin.readline
lst = list(input().strip())
rst = []
t = int(input())

for _ in range(t):
    d = input().strip().split()
    if(d[0] == "L"):
        if(lst):
            rst.append(lst.pop())

    elif(d[0] == "D"):
        if(rst):
            lst.append(rst.pop())
    elif(d[0]=="B"):
        if(lst):
            lst.pop()
    elif(d[0]=="P"):
        lst.append(d[1])

lst+=rst[::-1]
print("".join(lst))

キュー


PythonにQライブラリは存在しません...逆に、リストを使用して類似の機能を作成することができます.
ただし、キューではなくインデックスを使用します.リストの演算速度が速くないため、Collections import dequeからインポートされるライブラリの速度が速くなります.
- 선언
queue = []

-추가 및 삭제
queue.append(4)
queue.pop(0) #데이터 삭제 및 반환

- 조회
queue[0]

- 기타
len(queue)==0 #데이터 없음
if(queue) #데이터 존재하는지 확인 -> 이게 조금 더 좋음
len(queue) #데이터 갯수 확인
queue.clear(): 큐 비우기

質問する


10845キュー


stdinは標準inputを表し,一見,input()と同じ動作を実行すると考えられる.
sys.stdin.readline()はユーザー入力を受け入れますが、開行文字入力も受け入れられます.また、入力サイズを制限することで、1回の読み取り文字数を決定することができる.
この入力=sysです.stdin.inputではなくreadlineを使用してsysを作成します.stdin.readlineは使用できますが、書き換え文字も受信します.strip(2行の文字を削除)または.rstrip(右文字を削除)を同時に使用することが望ましい.
3つの演算子が使用されています.
True if x else False
import sys
sys.stdin = open("input.txt","r")

input = sys.stdin.readline

t = int(input())
queue = []

for _ in range(t):
    s = input().strip().split(" ")
    if(s[0] == "push"): queue.append(s[1])
    elif(s[0]=="pop"):
        if(queue): print(queue.pop(0))
        else: print("-1")
    elif(s[0]=="size"): print(len(queue))
    elif(s[0]=="empty"): print("0") if queue else print("1")
    elif(s[0]=="front"): print(queue[0]) if queue else print("-1")
    elif(s[0]=="back"): print(queue[-1]) if queue else print("-1")

1158ジョセフス問題


ジョセフスの問題を直接リストに載せると、大きな時間制限を受けます...

そのため、今回はPythonライブラリIndiQを使ったほうがいいです.
実際、Pythonでキューを使用する場合は、できるだけインデックスを使用するのが有効です.
import sys
sys.stdin = open("input.txt","r")
from collections import deque
input = sys.stdin.readline

t,m = map(int,input().rstrip().split())
q = deque()
for i in range(1,t+1):
    q.append(i)

ans=[]
for i in range(t-1):
    for j in range(m-1):
        q.append(q.popleft())
    ans+=[q.popleft()]

ans+=[q[0]]
print('<'+', '.join(map(str,ans))+'>')

デッキ


まず、インデックスは双方向接続リストで構成され、Pythonライブラリが使用されます.
- 선언
from collections import deque
dq = deque()

-추가 및 삭제
dq.append(4) #오른쪽에 데이터 삽입
dq.appendleft(4) #왼쪽에 데이터 삽입
dq.pop() #오른쪽 데이터 삭제 및 반환
dq.leftpop() #왼쪽 데이터 삭제 및 반환

- 조회
queue[0]

- 기타
len(dq)==0 #데이터 없음
if(dq) #데이터 존재하는지 확인 -> 이게 조금 더 좋음
len(dq) #데이터 갯수 확인
dq.clear(): 큐 비우기

質問する


10866インデックス

import sys
sys.stdin = open("input.txt","r")
from collections import deque

input = sys.stdin.readline

t = int(input().rstrip())
dq = deque()

for _ in range(t):
    s = input().rstrip().split()
    if(s[0]=="push_front"): dq.appendleft(s[1])
    elif(s[0]=="push_back"): dq.append(s[1])
    elif(s[0]=="pop_front"):
        if(dq):
            print(dq.popleft())
        else:
            print("-1")
    elif(s[0]=="pop_back"):
        if(dq):
            print(dq.pop())
        else:
            print("-1")
    elif(s[0]=="size"): print(len(dq))
    elif(s[0]=="empty"): print(0 if dq else 1)
    elif(s[0]=="front"):
        if(dq):
            print(dq[0])
        else:
            print("-1")
    elif(s[0]=="back"):
        if(dq):
            print(dq[-1])
        else:
            print("-1")

単語を逆さまにする