Reus was the first of two Dortmund players to be sent off in five second-half minutes as Schalke came from behind to hand Bayern Munich a golden opportunity to win their seventh straight league title.
League leaders Bayern can now pull four points clear at the top with three games to go with a win at relegation-threatened Nuremberg on Sunday.
Dortmund took the lead in style on 14 minutes, Jadon Sancho setting up Mario Goetze with a splendid chip over Schalke’s back line.
However Schalke drew level just two minutes later, Daniel Caligiuri converting a contested penalty after a handball decision against Julian Weigl.
Two minutes later the visitors sent the Signal-Iduna-Park into shock as Salif Sane rose at a corner to put Schalke ahead.
Double disaster struck for Dortmund on the hour mark when captain Marco Reus was sent off for a studs-up challenge on Suat Serdar and Caligiuri curled the resulting free-kick into the top corner.
Marius Wolf then became the second Dortmund player to be sent off, once again for a reckless challenge on Serdar.
Axel Witsel pulled one back for Dortmund on with five minutes remaining, but their hopes were crushed a moment later when Breel Embolo fired in Schalke’s fourth.
Elsewhere, RB Leipzig secured Champions League qualification with a 2-1 win over Freiburg, while fourth-place Eintracht Frankfurt were held to a 0-0 draw by Hertha Berlin.
Freiburg’s Vicenzo Grifo became the first opposing player to score in Leipzig since February, cheekily converting a free-kick before goalkeeper Peter Gulacsi was ready.
Yet goals from Timo Werner and Emil Forsberg saw Leipzig to a sixth straight win.
Werder Bremen’s hopes of qualifying for Europe were dealt a blow as they lost 4-1 at Fortuna Duesseldorf.
They are five points of the Europa league places after a defeat in which Benito Raman put the hosts ahead after just 55 seconds, and Kenan Karaman doubled the lead on 23 minutes.
A Max Kruse penalty restored hope for Werder, but second-half goals from Rouwen Hennings and Markus Suttner sealed the home win.
At the other end of the table, Henrik Weydandt fired bottom club Hanover to a 1-0 win over Mainz that means they still have escape relegation.
For more news your way, download The Citizen’s app for iOS and Android.
Download our app and read this and other great stories on the move. Available for Android and iOS.